Warum ist ein Graph - bestehend aus Knoten und Verbindungen (jeweils mit Attributen) eigentlich so gut geeignet, die meisten Domänen ohne Verrenkungen zu modellieren? Warum habe ich bisher noch nie etwas von der etablierten Graphendatenbank Neo4j gehört? Was kann ich denn konkret damit machen? Welche interessanten Anwendungsgebiete gibt es? Das objektorientierte API ist gut und schön, aber ich möchte meine Objekte direkt in den Graphen abbilden, kann ich das? Gibt es Neo4j, mit spannenden Datensets, auch als gehostete Lösung, um direkt zu starten? Was für eine Programmiersprache brauche ich denn für eine ...4j-Datenbank?
Diese und viele andere Fragen wollen wir in der Präsentation beantworten. Von den Grundlagen angefangen, über Beispiele mit Aha-Effekten bis zum kompakten API von Neo4j und den Treibern für viele Programmiersprachen wird alles vorgestellt. Besonders wichtig ist die Mächtigkeit in Bezug auf die einfache Modellierung beliebiger Domänen. Dabei kann das Objekt-Graph-Mapping auf der Basis der von uns entwickelten Spring-Data-Graph Bibliothek noch einmal kräftig punkten. Den Abschluss der Präsentation bildet ein Abstecher zu gehosteten Neo4j-Instanzen, die besonders für PaaS-Provider, wie z.B. Heroku, sehr geeignet sind.
3. Relationales Modell, allseits bekannt
We all know the
relational model.
It has been predominant
for a long time.
Attendees
username fullname registration speaker payment
mtiberg Michael Tiberg null no 0
thobe Tobias Ivarsson 2010-04-07 yes 0
joe John Doe 2010-02-05 no 700
... ... ... ... ...
3
4. Relationales Modell, allseits bekannt
We all know the
relational model.
Attendees It has been predominant
for a long time.
username fullname registration speaker payment
mtiberg Michael Tiberg null no 0
thobe Tobias Ivarsson 2010-04-07 yes 0
joe John Doe 2010-02-05 no 700
... ... ... ... ...
3
5. Relationales Modell, allseits bekannt
We all know the
relational model.
It has been predominant
for a long time.
Attendees
username fullname registration speaker payment
mtiberg Michael Tiberg null no 0
thobe Tobias Ivarsson 2010-04-07 yes 0
joe John Doe 2010-02-05 no 700
... ... ... ... ...
3
6. Attendees
The relational model has
username fullname registration speaker payment a few problems, such as:
•poor support for sparse
data
•modifying the data
mtiberg Michael Tiberg null no 0 model is almost
exclusively done through
adding tables
thobe Tobias Ivarsson 2010-04-07 yes 0
joe John Doe 2010-02-05 no 700
... ... ... ... ...
Location
username latitude longitude title publish
thobe 55°36'47.70"N 12°58'34.50"E Malmö yes
San
joe 37°49'36.00"N 122°25'22.00"W no
Francisco
... ... ... ... ...
4
7. Attendees
username fullname registration speaker payment
mtiberg Michael Tiberg null no 0
thobe Tobias Ivarsson 2010-04-07 yes 0
joe John Doe 2010-02-05 no 700
... ... ... ... ...
Location
username latitude longitude title publish
thobe 55°36'47.70"N 12°58'34.50"E Malmö yes
After a while, modeling
complex relationships
leads to complicated San
schemasjoe 37°49'36.00"N 122°25'22.00"W no
Francisco
... ... ... ... ...
5
8. Attendees Sessions
username fullname registration speaker payment id title time room ...
... ... ... ... ...
mtiberg Michael Tiberg null no 0
... ... ... ... ...
thobe Tobias Ivarsson 2010-04-07 yes 0
Session attendance
joe John Doe 2010-02-05 no 700 session user
... ... ... ... ... ... ...
Location ... ...
username latitude longitude title publish
More complication...
thobe 55°36'47.70"N 12°58'34.50"E Malmö yes ... ...
... ...
After a while, modeling ... ...
complex relationships ... ...
leads to complicated
...... ......
San ......
schemasjoe 37°49'36.00"N 122°25'22.00"W no ......
Francisco ...... ......
...... ......
... ... ... ... ...
5
9. After a while, modeling
complex relationships
leads to complicated
schemas
5
11. Willkommen in der Matrix
- die Welt - ein Netz
Google Bildersuche: „graph OR network“
7
12. Willkommen in der Matrix
- die Welt - ein Netz
๏ Zusammenhänge in
• Politik,Wirtschaft, Geschichte,Wissenschaft,Verkehr
๏ Biologie, Chemie, Physik, Soziologie
• Körper, Ökosphere, Reaktionen, Interaktionen
๏ Internet
• Hardware, Software, Interaktion
๏ Soziale Netzwerke
• Familie, Freunde
• Arbeit, Communities
• Nachbarn, Städte, Lebensräume, Gesellschaft 8
13. Gute Beziehungen
๏ die Welt besteht aus Dingen und deren Beziehungen
๏ Beziehungen sind oft genauso wichtig wie die Dinge
๏ Netze = Ganzes > Summe der Teile
๏ komplexe Zusammenhänge
๏ ständiger Wandel,Veränderung auch von Strukturen
๏ Graph: Beziehungen sind Teil der Daten
๏ RDBMS: Beziehungen sind Teil des starren Schemas
9
14. Fragen und Antworten
๏ Komplexe Fragen
๏ Antworten liegen zwischen den Zeilen (Dingen)
๏ Lokalität der Informationen
๏ Globale Suchen sind sehr teuer
๏ Antwortzeiten sollten konstant sein, unabhängig von Datenmenge
10
15. Kategorien ?
๏ Kategorien == Klassen, Bäume ?
๏ Was ist wenn mehr als eine Kategorie passt?
๏ Tags
๏ Kategorie über Beziehungen „IS_A“
๏ beliebig viele, schnelle Änderung
๏ „virtuelle“ Beziehungen - Traversals
๏ Kategorie dynamisch aus den Fragestellungen
11
46. Kategorie II: Column (BigTable) Datenbanken
๏ Herkunft:
• “Bigtable:(2006)
Data”
A Distributed Storage System for Structured
๏ Datenmodell:
• Große Tabelle mit Spalten Familien
๏ Beispiele:
• HBase
• HyperTable
• Cassandra 22
47. Kategorie III: Dokumentendatenbanken
๏ Herkunft:
• Lotus Notes
๏ Datenmodell:
• Sammlung von Dokumenten
• Ein Dokument ist eine Key-Value Menge
๏ Beispiele:
• CouchDB (CouchBase)
• MongoDB
23
48. Kategorie IV: Graphendatenbanken
๏ Herkunft:
• Graphentheory, Euler
๏ Datenmodell:
• Knoten mit Attributen
• Gerichtete Kanten
• Kanten mit Identität,Typ und Attributen
• Hyperedges
24
49. Scaling to size vs. Scaling to complexity
Size
Key/Value stores
Bigtable clones
Document databases
Graph databases
Billions of nodes
and relationships
> 90% of use cases
Complexity
25
51. Polyglot Persistence
๏ Ein System, mehrere Datenbanken
- das beste Tool für das Problem nutzen
๏ Beispiele:
• RDBMS für strukturierte DatenEntitäten Graphendatenbank für
die Relationen zwischen den
und eine
• Domänenmodell in derDokumenten Datenbankgroße
Dokumente in einer
Graphendatenbank und
27
54. The Property Graph data model
•Nodes
•Relationships bet ween Nodes
•Relationships have Labels
•Relationships are directed, but traversed at equal
speed in both directions
•The semantics of the direction is up to the
application (LIVES WITH is reflexive, LOVES is not)
•Nodes have key-value properties
•Relationships have key-value properties 30
55. The Property Graph data model
•Nodes
•Relationships bet ween Nodes
•Relationships have Labels
•Relationships are directed, but traversed at equal
speed in both directions
•The semantics of the direction is up to the
application (LIVES WITH is reflexive, LOVES is not)
•Nodes have key-value properties
•Relationships have key-value properties 30
56. The Property Graph data model
•Nodes
•Relationships bet ween Nodes
•Relationships have Labels
•Relationships are directed, but traversed at equal
speed in both directions
•The semantics of the direction is up to the
application (LIVES WITH is reflexive, LOVES is not)
•Nodes have key-value properties
•Relationships have key-value properties 30
57. The Property Graph data model
LIVES WITH
LOVES
OWNS
DRIVES
•Nodes
•Relationships bet ween Nodes
•Relationships have Labels
•Relationships are directed, but traversed at equal
speed in both directions
•The semantics of the direction is up to the
application (LIVES WITH is reflexive, LOVES is not)
•Nodes have key-value properties
•Relationships have key-value properties 30
58. The Property Graph data model
LOVES
LIVES WITH
LOVES
OWNS
DRIVES
•Nodes
•Relationships bet ween Nodes
•Relationships have Labels
•Relationships are directed, but traversed at equal
speed in both directions
•The semantics of the direction is up to the
application (LIVES WITH is reflexive, LOVES is not)
•Nodes have key-value properties
•Relationships have key-value properties 30
59. The Property Graph data model
name: “Mary”
LOVES
name: “James” age: 35
age: 32 LIVES WITH
twitter: “@spam” LOVES
OWNS
DRIVES
•Nodes
•Relationships bet ween Nodes
•Relationships have Labels brand: “Volvo”
•Relationships are directed, but traversed at equal model: “V70”
speed in both directions
•The semantics of the direction is up to the
application (LIVES WITH is reflexive, LOVES is not)
•Nodes have key-value properties
•Relationships have key-value properties 30
60. The Property Graph data model
name: “Mary”
LOVES
name: “James” age: 35
age: 32 LIVES WITH
twitter: “@spam” LOVES
OWNS
item type: “car” DRIVES
•Nodes
•Relationships bet ween Nodes
•Relationships have Labels brand: “Volvo”
•Relationships are directed, but traversed at equal model: “V70”
speed in both directions
•The semantics of the direction is up to the
application (LIVES WITH is reflexive, LOVES is not)
•Nodes have key-value properties
•Relationships have key-value properties 30
61. Graphen sind whiteboard friendly An application domain model
outlined on a whiteboard or piece
of paper would be translated to
an ER-diagram, then normalized
to fit a Relational Database.
With a Graph Database the model
from the whiteboard is
implemented directly.
Image credits: Tobias Ivarsson 31
62. Graphen sind whiteboard friendly An application domain model
outlined on a whiteboard or piece
of paper would be translated to
an ER-diagram, then normalized
to fit a Relational Database.
With a Graph Database the model
from the whiteboard is
implemented directly.
*
1
*
* 1
* 1
*
1
*
Image credits: Tobias Ivarsson 31
63. Graphen sind whiteboard friendly An application domain model
outlined on a whiteboard or piece
of paper would be translated to
an ER-diagram, then normalized
to fit a Relational Database.
With a Graph Database the model
from the whiteboard is
implemented directly.
thobe
Joe project blog
Wardrobe Strength
Hello Joe
Modularizing Jython
Neo4j performance analysis
Image credits: Tobias Ivarsson 31
64. Anwendungsgebiete
๏ Vernetzte Domänen
๏ Beziehungen zwischen Entitäten sind ein wichtiger Aspekt
๏ Komplexe Fragestellungen
๏ Lokale Antworten, durch mehrstufige Traversierung
32
70. ungeeignete Anwendungsgebiete
๏ Datenmengen > Pentabyte
๏ viele parallele simple lookup Anfragen (KV)
๏ massive Setoperationen auf großen, gleich strukturierten Daten
(RDBMS)
๏ viele große Binärdaten (BLOB)
38
71. Neo4j is a Graph Database
Graph databases FOCUS
on the interconnection
bet ween entities.
39
72. IS _A
Neo4j Graph Database
Graph databases FOCUS
on the interconnection
bet ween entities.
39
73. Anforderungen an ein Soziales Netzwerk
๏ Mit Freunden interagieren
๏ Empfehlungen für neue Freunde
๏ Sozialer Kontext einer Person
z.B. Wie bin ich mit derjenigen verbunden?
๏ Rechte innerhalb des Netzes
• z.b. Darf ich auf Daten der Person zugreifen?
40
74. “Schema” design
๏ Personen sind Knoten
๏ Freundschaften sind Beziehungen zwischen Personen Knoten
๏ Gruppen sind Knoten
๏ Gruppenmitgliedschaft sind Beziehungen zwischen
von Personen Knoten zu Gruppen Knoten
๏ Index für Personen Knoten für Suche nach Namen
๏ Index für Gruppen Knoten für Suche nach Namen
๏ Traversals für Empfehlungen für Personen die nach Namen gesucht
wurden
๏ Zugriffsrechte über Traversals von aktueller Person über Gruppen
zu Zielperson 41
76. Ein kleines soziales Netz
Knoten haben verschiedene Eigenschaften
Matrix Charaktere: Menschen vs. Programme
Strukturen und Eigenschaften nach und nach aufbauen
Fragestellungen: Gegner von Neo
77. Ein kleines soziales Netz
FRIENDSHIP
MEMBERSHIP Dozer
Nebuchadnezzar crew
ily
:F am
r
a lifie
Qu
Tank
Morpheus
Agent Brown
Agent Smith
Thomas Anderson
Cypher
Q
ua
lifi
er
:L
ov
er
s Agent taskforce
Trinity
44
79. Neo4j SDG API: Creating a social graph
@NodeEntity class Person {
@Indexed String name;
@Min(0) @Max(120) int age;
Rank rank;
@RelatedTo(elementClass= Person.class, type = "FRIENDSHIP")
Set<Person> friends;
}
Person mrAnderson = new Person("Thomas Anderson");
mrAnderson.setAge( 29 );
Person morpheus = new Person("Morpheus" );
morpheus.setRank( Rank.Captain );
mrAnderson.getFriends().add(morpheus);
mrAnderson.relateTo(morpheus, "FRIENDSHIP");
46
80. Neo4j Ruby API: Creating a social graph
gem install neo4j
require ”rubygems”
require 'neo4j'
class Person
include Neo4j::NodeMixin
property :name, :age, :rank
index :name
has_n :friends
end
Neo4j::Transaction.run do
neo = Person.new :name=>'Neo', :age=>29
morpheus = Person.new :name=>'Morpheus', :rank=>'Captain'
neo.friends << morpheus
end
neo.friends.each {|p|...}
47
81. Neo4j API: Recommend new friends
Node person = ...
TraversalDescription friendsOfFriends = Traversal.description()
.relationships( SocialGraphTypes.FRIENDSHIP )
.breadthFirst()
.evaluator( Evaluators.atDepth( 2 ) );
for ( Node recommendation :
friendsOfFriends.traverse( person ).nodes() ) {
System.out.println( recommendedFriend.getProperty("name") );
}
48
82. Neo4j SDG API: Recommend new friends
class Person {
@GraphTraversalBuilder(elementClass=Person.class, builder =
FOFBuilder.class)
Iterable<Person> friendOfFriends;
}
class FOFBuilder implements FieldTraversalDescriptionBuilder {
public TraversalDescription build(NodeBacked start ...) {
return Traversal.description().breadthFirst()
.relationships( SocialGraphTypes.FRIENDSHIP )
.evaluator( Evaluators.atDepth( 2 ) );
}}
TraversalDescription friendsOfFriends =
for ( Person recommendation : person.getFriendsOfFriends()) {
System.out.println( recommendation.getName() );
}
49
83. Neo4j API: How do I know this person?
Node me = ...
Node you = ...
PathFinder shortestPathFinder = GraphAlgoFactory.shortestPath(
Traversals.expanderForTypes(
SocialGraphTypes.FRIENDSHIP, Direction.BOTH ),
/* maximum depth: */ 4 );
Path shortestPath = shortestPathFinder.findSinglePath(me, you);
for ( Node friend : shortestPath.nodes() ) {
System.out.println( friend.getProperty( "name" ) );
}
50
84. Gibt es eine Verbindung im sozialen Netz
๏ Jeder hat durchschnittlich 50 Freunde
Tobias
Emil
Johan
Peter
51
85. Gibt es eine Verbindung im sozialen Netz
๏ Jeder hat durchschnittlich 50 Freunde
Tobias
Emil
Johan
Peter
Database # persons query time
Relational database 1 000 2 000 ms
Neo4j Graph Database 1 000 2 ms
Neo4j Graph Database 1 000 000 2 ms
51
86. Gibt es eine Verbindung im sozialen Netz
๏ Jeder hat durchschnittlich 50 Freunde
Tobias
Emil
Johan
Peter
Database # persons query time
Relational database 1 000 2 000 ms
Neo4j Graph Database 1 000 2 ms
Neo4j Graph Database 1 000 000 2 ms
51
87. Gibt es eine Verbindung im sozialen Netz
๏ Jeder hat durchschnittlich 50 Freunde
Tobias
Emil
Johan
Peter
Database # persons query time
Relational database 1 000 2 000 ms
Neo4j Graph Database 1 000 2 ms
Neo4j Graph Database 1 000 000 2 ms
51
88. Gibt es eine Verbindung im sozialen Netz
๏ Jeder hat durchschnittlich 50 Freunde
Tobias
Emil
Johan
Peter
Database # persons query time
Relational database 1 000 2 000 ms
Neo4j Graph Database 1 000 2 ms
Neo4j Graph Database 1 000 000 2 ms
51
91. Mehr über Neo4j
๏ Neo4j läuft produktiv
• In 24/7 Betrieb seit 2003
๏ Neo4j wird aktiv entwickelt
• Neo Technology hatte mehrere VC Finanzierungs - Runden
๏ Neo4j erbringt hochperformante Graphen-Operationen
• 32 Mrd Knoten/Relationships & 64 Mrd Properties
• traversiert 1’000’000+ Relationships / Sekunde
auf Standardhardware
54
92. Features
๏ ACID (JTA/JTS, XA, 2PC, Tx recovery, deadlock detection, MVCC)
๏ Treiber (nativ, REST) für viele Programmiersprachen
๏ Property Graph Model
๏ hochperformante Traversals
๏ Data Size / Short Strings
๏ eigenes binäres Storage-Format (NIO / memory mapping)
๏ Integration externer Transaction Manager
๏ verschiedene Indexing Provider (Lucene, Redis, Berkeley DB)
55
96. Anwender
๏ StudiVZ - soziale Netze
๏ ThingWorx - Network of Things
๏ amanziTel - TelCo Infrastruktur
๏ Bio4j - bioinformatics DB
๏ structr - open source CMS
๏ evident Software - device management
๏ und viele mehr
๏ einige Großfirmen, die (noch) nicht
genannt werden wollen
59
97. Neo4j ist Open Source -
Produkte & Lizenzen
๏ Community Edition
• alle Features, Embedded und Server
• GPL
๏ Advanced
• + Monitoring & Support
• AGPL oder Commercial
๏ Enterprise
• HA
• Online Backup
• AGPL oder Commercial 60
98. Aktive Community
๏ Open Source & Engagement ist Grundlage für Erfolg
๏ durch GPL noch einmal verstärkt
๏ sehr aktive Mailingliste (700 / Monat)
๏ GitHub
• http://github.com/neo4j
• http://github.com/neo4j-examples
๏ Wiki
• http://wiki.neo4j.org
๏ Alle Bindings / Driver von der Community entwickelt
• http://neo4j.org/community/languages/ 61
99. Social movie database tutorial - cineasts.net
Runs on top of the Spring Framework, Spring Data Graph and Neo4j
Also available on VMware‘s PaaS offering CloudFoundry
http://cineasts.cloudfoundry.com
62
100. Die Zukunft
๏ Neo4j-Hosting
• Heroku
• CloudFoundry
• DotCloud
• Azure
๏ Query Language
from n=NODE(name,“Emil“), n -[r,KNOWS,..]-> f
where f.name = „Michael“
select n.name, f.name, r.length
๏ bessere Remote-Protokolle
๏ mehr Index Provider (Redis, BDB)
63
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
TODO: explain how it get out of hand. scaling + complexity\n... what if we could rethink the model ...\n
\n
social networks (our actions in them work life health)\nthe internet\nits hardware\nits software\nour interactions\nour body\nnature environment\npolitical economic networks\nzusammenhaenge\nhistory\nscience\nzeit gr&#xFC;nen abgeordneter handy\n
social networks (our actions in them work life health)\nthe internet\nits hardware\nits software\nour interactions\nour body\nnature environment\npolitical economic networks\nzusammenhaenge\nhistory\nscience\nzeit gr&#xFC;nen abgeordneter handy\n
messy world\nfast changing world\nbez um graph sind teil der daten\nim rdbms teil des starren schemas\nkomplexe zusammenhaenge\nkomplexe fragen\nimmer neue kategorien - rels\ndynamisch - traversals\ntags attribute\ntemporale attribute\ndyn sprachen besser geeignet \n
messy world\nfast changing world\nbez um graph sind teil der daten\nim rdbms teil des starren schemas\nkomplexe zusammenhaenge\nkomplexe fragen\nimmer neue kategorien - rels\ndynamisch - traversals\ntags attribute\ntemporale attribute\ndyn sprachen besser geeignet \n
messy world\nfast changing world\nbez um graph sind teil der daten\nim rdbms teil des starren schemas\nkomplexe zusammenhaenge\nkomplexe fragen\nimmer neue kategorien - rels\ndynamisch - traversals\ntags attribute\ntemporale attribute\ndyn sprachen besser geeignet \n
messy world\nfast changing world\nbez um graph sind teil der daten\nim rdbms teil des starren schemas\nkomplexe zusammenhaenge\nkomplexe fragen\nimmer neue kategorien - rels\ndynamisch - traversals\ntags attribute\ntemporale attribute\ndyn sprachen besser geeignet \n
\n
\n
\n
messy world\nfast changing world\nbez um graph sind teil der daten\nim rdbms teil des starren schemas\nkomplexe zusammenhaenge\nkomplexe fragen\nimmer neue kategorien - rels\ndynamisch - traversals\ntags attribute\ntemporale attribute\ndyn sprachen besser geeignet \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
BASE (Brewer 1997)\nBasically Available\nSoft State\nEventual Consistent\n
\n
\n
\n
\n
\n
\n
Most of the emerging database technologies are concerned with scaling to huge amounts of data and massive load.\nThey do so by making data opaque and distribute elements based on key.\n
Use the right shape of database for the right kind of object\n
\n
\n
\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n
nodes\nrelationships between nodes\nrelationships have types and directions\nrelationships are traversed equally fast in each direction, direction may be significant or not\nnodes have properties\nrelationships have properties\n