Navigate *All* the Knowledge
Getting started with ConceptMap.io
James L. Weaver
Developer Advocate
Twitter: @JavaFXpert
Email: jweaver@pivotal.io
http://JavaFXpert.com
http://CulturedEar.com



@JavaFXpert
About the Presenter
Java Champion, JavaOne Rockstar, plays well with others, etc :-)
Author of several Java/JavaFX/RaspPi books


@JavaFXpert
Mission: "Transform how the world builds software"







Mission: "Transform how the world builds software"


App is live at ConceptMap.io
ConceptMap.io source code for services and UI: https://github.com/JavaFXpert/wikibrowser-service
Open source, licensed under the Apache License, Version 2.0
Note: These Technical Presentation slides are available at
http://slides.com/javafxpert/conceptmap-technical
as well as by clicking the Help button in ConceptMap.io


@JavaFXpert
Wikimedia has many projects

Graphic from presentation by Lynda Pintscher

@JavaFXpert

... the most famous is Wikipedia
Graphic from 2013 presentation by Lynda Pintscher

@JavaFXpert
Graphic from 2013 presentation by Lynda Pintscher
Wikimedia Commons
Media files leveraged by Wikimedia projects


@JavaFXpert
Graphic from 2013 presentation by Lynda Pintscher
Wikidata
Central storage for the structured data of Wikimedia projects


@JavaFXpert
Graphic from 2013 presentation by Lynda Pintscher
Wikidata
Provides semantic structure for Wikipedia articles in any language


@JavaFXpert
Wikipedia + Wikidata
Wikipedia articles and their relationships to each other

@JavaFXpert
The Big Idea: ConceptMap.io
Navigate/pin Wikipedia articles via links and Wikidata relationships

@JavaFXpert
Designed to facilitate:
-
Learning
-
Teaching
-
Research


Learning/Teaching Scenario

Search for an item and pin it to the concept map
Learning/Teaching Scenario

Select a link in the Wikipedia article
Learning/Teaching Scenario

Pin the item to the concept map
Learning/Teaching Scenario

Select an item in the map, expand a relationship, and select an item
Learning/Teaching Scenario

Pin the item to the concept map
Learning/Teaching Scenario

Select an item in the map, and click the [x1] button for a relationship
Learning/Teaching Scenario

The [x1] button pinned the items found at the first level of the relationship
Learning/Teaching Scenario

Select an item in the concept map, and select an item From Related Items
Learning/Teaching Scenario

Pin the item to the concept map
Learning/Teaching Scenario

Continue selecting items from Wikipedia articles and Wikidata Relationships
Learning/Teaching Scenario
... and pin them to the concept map

Learning/Teaching Scenario
Edit relationships for an item by selecting Wikidata icon

Learning/Teaching Scenario
Wikidata page appears with which anyone may edit the item's info

Learning/Teaching Scenario
Select the Link icon to create a link to the concept map

Learning/Teaching Scenario
Share the link to your concept map with a colleague or student


High-level view of distributed architecture




Use case: Search for Earth



Use case: Pin Earth to graph



http://example/graph?items=Q2,Q405,Q525
MATCH (a:Item), (b:Item)
WHERE a.itemId IN ['Q2', 'Q405', 'Q525']
AND b.itemId IN ['Q2', 'Q405', 'Q525']
WITH a, b
OPTIONAL MATCH (a)-[rel]-(b)
RETURN a, b, collect(rel)

Neo4j Cypher query
(find all relationships between pinned items)
Resource controller
http://example/visgraph?items=Q2,Q405,Q525
Note: Because Jackson 2 is on the classpath, Spring’s MappingJackson2HttpMessageConverter is automatically chosen to convert the GraphResponseNear instance to JSON
@RestController
public class WikiGraphController {
@RequestMapping(value = "/graph", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE
public ResponseEntity<Object> search(@RequestParam(value = "items", defaultValue="")
String items) {
GraphResponseNear graphResponseNear = null;
...
return Optional.ofNullable(graphResponseNear)
.map(cr -> new ResponseEntity<>((Object)cr, HttpStatus.OK))
.orElse(new ResponseEntity<>("Graph query unsuccessful",
HttpStatus.INTERNAL_SERVER_ERROR));
}
}
To learn more, see Building a RESTful Web Service Spring Guide
Resource representation
public class Item {
private String type;
private String id;
public Item() {
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}

Use case: Change language



Use case: Share link


Use case: Breadth-first search

(expand items related by a given property to a given depth)


Use case: Items in common
Text
(all shortest paths, two hops or less)



Neo4j Cypher query
http://example/visshortpaths?id=Q111&target=Q313
MATCH p=allShortestPaths(
(a:Item {itemId:'Q111'})-[*..2]-(b:Item {itemId:'Q313'})
)
RETURN p

(all shortest paths, two hops or less)
Use case: Navigate to root
(shortest path to Entity using subclass of, instance of, part of)



Neo4j Cypher query
http://example/visrootpaths?id=Q332
MATCH p=allShortestPaths(
(a:Item {itemId:'Q332'})-[*]->(b:Item {itemId:'Q35120'})
)
WHERE NONE(x IN RELATIONSHIPS(p)
WHERE (x.propId <> 'P279') AND
(x.propId <> 'P31') AND
(x.propId <> 'P361')
)
RETURN p

(shortest path to Entity using subclass of, instance of, part of)
Make the app executable
package com.javafxpert.wikibrowser;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@EnableConfigurationProperties
@SpringBootApplication
public class WikiBrowserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(WikiBrowserServiceApplication.class, args);
}
}
To learn more, see Building a RESTful Web Service Spring Guide

App build/deploy cycle
- $ mvn clean install
- $ cf push

Note: One method of deployment for Spring Boot apps is a JAR file, which contains an embedded Tomcat servlet container.

Pivotal Web Services Console

start.spring.io


Use case: Degrees of separation

Text
(shortest path, like Kevin Bacon game)


Use case: Amazon Alexa












"ask concept map"
"get teams for Lionel Messi"
AWS Lambda developed in Java
Navigate *All* the Knowledge
ConceptMap.io from a technical perspective
James L. Weaver
Developer Advocate
Twitter: @JavaFXpert
Email: jweaver@pivotal.io
http://JavaFXpert.com
http://CulturedEar.com



Hope you enjoyed
Getting Started with ConceptMap.io
By javafxpert
Getting Started with ConceptMap.io
Exploring the technologies employed in ConceptMap.io
- 39,187