Neo4J, what else?2. AGENDA
• Positionering binnen NoSql
• Wat is een graph (Graaf)
• Neo4j
• Neoclipse
• Kamer van Koophandel
• Vragen?
8. WAT IS EEN GRAPH?
• Leonhard Euler (1736)
• Seven Bridges of Königsberg
http://en.wikipedia.org/wiki/Seven_Bridges_of_Königsberg
18. Experiment: Hoe zijn 2 nodes verbonden?
• 1000 personen
• gemiddeld 50 relaties
• Zijn
2 personen verbonden
met maximaal 4 stappen?
• Warme cache
19. Experiment: Hoe zijn 2 nodes verbonden?
• 1000 personen Relationeel Neo4j
• gemiddeld 50 relaties
• Zijn
1000 2000ms 2ms
2 personen verbonden
met maximaal 4 stappen?
• Warme cache 1 000 000 ? 2ms
20. Experiment: Hoe zijn 2 nodes verbonden?
• 1000 personen Relationeel Neo4j
• gemiddeld 50 relaties
• Zijn
1000 2000ms 2ms
2 personen verbonden
met maximaal 4 stappen?
• Warme cache 1 000 000 ? 2ms
23. GETYPEERDE RELATIES
speelt_in
type: persoon type: team
name: Ron name: S2
coach_van
type: persoon
name: Corjan
24. PROPERTIES OP RELATIES
speelt_in
type: persoon type: team
name: Ron name: S2
jaar: 2011
coach_van
jaar: 2011
type: persoon
name: Corjan
25. PROPERTIES
• Alle Java primitieven kunnen gebruikt worden:
• String
• boolean
• int
• double
• ...
29. EMBEDDABLE, SERVER
HIGH AVAILABLE
• new EmbeddedGraphDatabase("/tmp/neodb");
• GET http://localhost:7474/db/data/node/123
• Map<String,String> config = HighlyAvailableGraphDatabase.loadConfigurations( configFile );
GraphDatabaseService db = new HighlyAvailableGraphDatabase( path, config );
30. CREATE NODES
Transaction tx = db.beginTx();
try {
Node ron = db.createNode();
ron.setProperty("name", "Ron van Weverwijk");
tx.success();
} finally {
tx.finish();
}
31. CREATE RELATIONS
Transaction tx = db.beginTx();
try {
Node ron = db.createNode();
ron.setProperty("name", "Ron van Weverwijk");
Node lindy = db.createNode();
susan.setProperty("name", "Lindy van Weverwijk - Tersteeg");
lindy.createRelationshipTo(ron,
DynamicRelationshipType.withName("MARIED"));
tx.success();
} finally {
tx.finish();
}
36. ALGORITHMS
• find all paths
• find all simple paths
• find the shortest path
• Dijkstra algorithm
• The a* search algorithm
38. LUCENE
Transaction tx = db.beginTx();
try {
Node ron = db.createNode();
ron.setProperty("name", "Ron van Weverwijk");
Index<Node> people = db.index().forNodes("people");
people.add(ron, "name", ron.getProperty("name"));
tx.success();
} finally {
tx.finish();
}
42. NEOCLIPSE
• eclipse applicatie
• bekijk je Neo4j graph
• toevoegen / verwijderen nodes en relations
43. player_of
Mathieu coach_of
S2 Corjan
player_of
commission_member_of
Ron Webcommissie
commission_member_of
Dennis
45. NODE WRAPPING
public class MemberNode implements Member {
private Node node;
public static final String MEMBER_NAME_KEY = "name";
public MemberNode(Node node) {
this.node = node;
}
public String getName() {
return (String) getNode().getProperty(MEMBER_NAME_KEY);
}
public void setName(String name) {
getNode().setProperty(MEMBER_NAME_KEY, name);
}
}
48. PROBLEEM
• HuidigeDB2 database was niet geschikt om graph
gerelateerde vragen te beantwoorden
• Huidige systeem kon maximaal 3 niveaus terug geven
• Response tijden waren te hoog
• Belasting van het huidige systeem was te zwaar
50. IN NEO4J LEGGEN WE DE
FOCUS OP DE RELATIE
Uw keuken Zijn keuken
B.V. B.V.
Bestuurder Bestuurder
Bob de
Bouwer
51. NIET ALLEEN 1 NIVEAU MAAR
ALLE NIVEAU’S
Haar keuken
B.V.
Bestuurder
Zijn keuken
Uw keuken B.V. Schaakvereniging
B.V. Schaatmat
Bestuurder
Bestuurder Bestuurder
Bob de
Bouwer
53. CIJFERS EN FEITEN
• 11 900 000 nodes
• 12 000 000 relaties
•2 gb geheugen
• 12 gb diskspace
• AIX Power 7,
0.7 CPU @ 3.0GHZ
55. GELEERDE LESSEN
• Blijf tekenen: Maak het netwerk visueel
• Maak proefopzetjes en refactor
• Pas node wrapping toe om het domein simpel te houden
• Typeer nodes
56. NEO4J 1.5
• kleinere disk-footprint
• Cypher verbeteringen
• HA verbeteringen
• Verbeterde webadmin
58. CREDITS
KvK
Kees van den Silvester van Ron van
Jasper Feenstra
Berg der Bijl Weverwijk
Feenstra IT Four Scouts Xebia