Django and Neo4j - Domain modeling that kicks ass
-
Upload
tobias-lindaaker -
Category
Technology
-
view
112 -
download
1
description
Transcript of Django and Neo4j - Domain modeling that kicks ass
![Page 1: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/1.jpg)
Django and Neo4jDomain modeling that kicks ass!
Tobias IvarssonHacker @ Neo Technology
twitter: @thobe / #neo4jemail: [email protected]: http://www.neo4j.org/web: http://www.thobe.org/
![Page 2: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/2.jpg)
2
It all started with this guy. Emil Eifrem, CEO of Neo Technology. We picked him apart, and inside his brain we found the base for a database that models the connections in between entities.
![Page 3: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/3.jpg)
2Image credits: US Army
It all started with this guy. Emil Eifrem, CEO of Neo Technology. We picked him apart, and inside his brain we found the base for a database that models the connections in between entities.
![Page 4: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/4.jpg)
2
It all started with this guy. Emil Eifrem, CEO of Neo Technology. We picked him apart, and inside his brain we found the base for a database that models the connections in between entities.
![Page 5: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/5.jpg)
2
Neo4jIt all started with this guy. Emil Eifrem, CEO of Neo Technology. We picked him apart, and inside his brain we found the base for a database that models the connections in between entities.
![Page 6: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/6.jpg)
NOSQL is a wide area
3
![Page 7: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/7.jpg)
The problems NOSQL focuses on
4Data complexity
Perfo
rman
ce
Majority ofWebapps
Semantic Trading
Salary List
Social network
}custom
Relational database
Requirement of application
Focus area of manyNOSQL Databases ๏ Huge amounts of data
๏ (mostly) Disjoint data
๏ Heavy load
๏ Many concurrent writers
All NOSQL databases focus on solving problems where RDBMSes fail.
most focus on...
While this handles the load, it lacks in “social”
![Page 8: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/8.jpg)
The evolution of data
5
Text documents
1990
Info
rmat
ion
conn
ectiv
ity Folksonomies
Tagging
User-generated content
Wikis
RSS
Blogs
Hypertext
2000 2010 2020
web 1.0 web 2.0 “web 3.0”
Ontologies
RDF
GiantGlobal
Graph (GGG)
... but it turns out that data evolves to become MORE interconnected (as well as greater sizes)
![Page 9: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/9.jpg)
Neo4j is a Graph Database
6
Graph databases FOCUS on the interconnection between entities.
![Page 10: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/10.jpg)
6
IS_A
Neo4j Graph Database
Graph databases FOCUS on the interconnection between entities.
![Page 11: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/11.jpg)
Scaling to size vs. Scaling to complexity
7
Size
Complexity
Key/Value stores
Bigtable clones
Document databases
Graph databases
![Page 12: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/12.jpg)
Scaling to size vs. Scaling to complexity
7
Size
Complexity
Key/Value stores
Bigtable clones
Document databases
Graph databases
> 90% of use cases
Billions of nodesand relationships
![Page 13: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/13.jpg)
What is Neo4j?๏Neo4j is a Graph Database
•Non-relational (“#nosql”), transactional (ACID), embedded
•Data is stored as a Graph / Network
‣Nodes and relationships with properties
‣“Property Graph” or “edge-labeled multidigraph”
• Schema free, bottom-up data model design
๏Neo4j is Open Source / Free (as in speech) Software
•AGPLv3
•Commercial (“dual license”) license available
‣First server is free (as in beer), next is inexpensive 8
Prices are available at http://neotechnology.com/
Contact us if you have questions and/or special license needs (e.g. if you want an evaluation license)
![Page 14: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/14.jpg)
More about Neo4j๏Neo4j is stable
• In 24/7 operation since 2003
๏Neo4j is in active development
•Neo Technology received VC funding October 2009
๏Neo4j delivers high performance graph operations
• traverses 1’000’000+ relationships / secondon commodity hardware(1000~2500 traversals/ms)
9
![Page 15: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/15.jpg)
Building business applications with Neo4j๏Try it out! It’s all open source!
•Build a prototype, find out your needs and how Neo4j matches
•AGPL says all your users should have access to your code- at this stage this is your employees / co-workers
10
![Page 16: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/16.jpg)
Building business applications with Neo4j๏Try it out! It’s all open source!
•Build a prototype, find out your needs and how Neo4j matches
•AGPL says all your users should have access to your code- at this stage this is your employees / co-workers
๏Put it in front of users! The license is free for the first server!
•Contact Neo Technology sales to get a free single server license
•You’ll (probably) not have massive load the first days
10
![Page 17: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/17.jpg)
Building business applications with Neo4j๏Try it out! It’s all open source!
•Build a prototype, find out your needs and how Neo4j matches
•AGPL says all your users should have access to your code- at this stage this is your employees / co-workers
๏Put it in front of users! The license is free for the first server!
•Contact Neo Technology sales to get a free single server license
•You’ll (probably) not have massive load the first days
๏As you grow, Neo4j grows with you!
•As your needs and revenue increase you can by an advanced license (prices are resonable)
10
![Page 18: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/18.jpg)
Graphs are all around us
A B C D ...
1
2
3
4
5
...
17 3.14 3 17.79333333333
42 10.11 14 30.33
316 6.66 1 2104.56
32 9.11 592 0.492432432432
2153.175765766
11
Even if this spreadsheet looks like it could be a fit for a RDBMS it isn’t:•RDBMSes have problems with extending indefinitely on both rows and columns•Formulas and data dependencies would quickly lead to heavy join operations
![Page 19: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/19.jpg)
Graphs are all around us
12
With data dependencies the spread sheet turns out to be a graph.
A B C D ...
1
2
3
4
5
...
17 3.14 3 = A1 * B1 / C1
42 10.11 14 = A2 * B2 / C2
316 6.66 1 = A3 * B3 / C3
32 9.11 592 = A4 * B4 / C4
= SUM(D2:D5)
![Page 20: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/20.jpg)
Graphs are all around us
12
With data dependencies the spread sheet turns out to be a graph.
A B C D ...
1
2
3
4
5
...
17 3.14 3 = A1 * B1 / C1
42 10.11 14 = A2 * B2 / C2
316 6.66 1 = A3 * B3 / C3
32 9.11 592 = A4 * B4 / C4
= SUM(D2:D5)
![Page 21: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/21.jpg)
Graphs are all around us
13
If we add external data sources the problem becomes even more interesting...
17 3.14 3 = A1 * B1 / C1
42 10.11 14 = A2 * B2 / C2
316 6.66 1 = A3 * B3 / C3
32 9.11 592 = A4 * B4 / C4
= SUM(D2:D5)
![Page 22: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/22.jpg)
Graphs are all around us
13
If we add external data sources the problem becomes even more interesting...
17 3.14 3 = A1 * B1 / C1
42 10.11 14 = A2 * B2 / C2
316 6.66 1 = A3 * B3 / C3
32 9.11 592 = A4 * B4 / C4
= SUM(D2:D5)
![Page 23: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/23.jpg)
The Neo4j Graph data model
14
•Nodes•Relationships between 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
![Page 24: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/24.jpg)
The Neo4j Graph data model
14
•Nodes•Relationships between 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
![Page 25: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/25.jpg)
The Neo4j Graph data model
14
LIVES WITHLOVES
OWNSDRIVES
•Nodes•Relationships between 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
![Page 26: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/26.jpg)
The Neo4j Graph data model
14
LIVES WITHLOVES
OWNSDRIVES
LOVES
•Nodes•Relationships between 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
![Page 27: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/27.jpg)
The Neo4j Graph data model
14
LIVES WITHLOVES
OWNSDRIVES
LOVESname: “James”age: 32twitter: “@spam”
name: “Mary”age: 35
brand: “Volvo”model: “V70”
•Nodes•Relationships between 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
![Page 28: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/28.jpg)
The Neo4j Graph data model
14
LIVES WITHLOVES
OWNSDRIVES
LOVESname: “James”age: 32twitter: “@spam”
name: “Mary”age: 35
brand: “Volvo”model: “V70”
item type: “car”
•Nodes•Relationships between 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
![Page 29: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/29.jpg)
Graphs are Whiteboard Friendly
15
The domain I specify is the domain I implement.No mismatch, no ER-modeling.
![Page 30: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/30.jpg)
Graphs are Whiteboard Friendly
15
thobe
Wardrobe Strength
dude
Hello world
OSCON
#6#14
#32
#17
Joe project
odin
Call site caching
Optimizing JythonBest panncakes
The domain I specify is the domain I implement.No mismatch, no ER-modeling.
![Page 31: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/31.jpg)
Graphs are Whiteboard Friendly
16
Wardrobe Strength
dude
Hello world
OSCON
#6#14
#32
#17
Joe project
odin
Call site caching
Optimizing JythonBest panncakes
username: “thobe”name: “Tobias Ivarsson”twitter: “@thobe”password: “**********”
![Page 32: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/32.jpg)
Graphs are Whiteboard Friendly
17
thobe
dude
Hello world
OSCON
#6#14
#32
#17
Joe project
odin
Call site caching
Optimizing JythonBest panncakes
address: “http://journal.thobe.org”title: “Wardrobe Strength”tagline: “Good enough thoughts”
![Page 33: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/33.jpg)
Building a graph - the basic APIimport neo4j
grapDb = neo4j.GraphDatabase( PATH_TO_YOUR_NEO4J_DATASTORE )
with graphDb.transaction: # All writes require transactions
# Create Thomas 'Neo' AndersonmrAnderson = graphDb.node(name="Thomas Anderson", age=29)
# Create Morpheusmorpheus = graphDb.node(name="Morpheus", rank= "Captain",
occupation= "Total bad ass")
# Create relationship representing they know each othermrAnderson.KNOWS( morpheus )
# ... similarly for Trinity, Cypher, Agent Smith, Architect
18
![Page 34: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/34.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
19
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
![Page 35: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/35.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
![Page 36: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/36.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
for friend_node in Friends(mr_anderson):print "%s (@ depth=%s)" % ( friend_node["name"],
friend_node.depth )
![Page 37: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/37.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
for friend_node in Friends(mr_anderson):print "%s (@ depth=%s)" % ( friend_node["name"],
friend_node.depth )
![Page 38: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/38.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
Morpheus (@ depth=1)
for friend_node in Friends(mr_anderson):print "%s (@ depth=%s)" % ( friend_node["name"],
friend_node.depth )
![Page 39: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/39.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
Morpheus (@ depth=1)
Trinity (@ depth=1)
for friend_node in Friends(mr_anderson):print "%s (@ depth=%s)" % ( friend_node["name"],
friend_node.depth )
![Page 40: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/40.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
Morpheus (@ depth=1)
Trinity (@ depth=1)
Cypher (@ depth=2)
for friend_node in Friends(mr_anderson):print "%s (@ depth=%s)" % ( friend_node["name"],
friend_node.depth )
![Page 41: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/41.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
Morpheus (@ depth=1)
Trinity (@ depth=1)
Cypher (@ depth=2)
Agent Smith (@ depth=3)
for friend_node in Friends(mr_anderson):print "%s (@ depth=%s)" % ( friend_node["name"],
friend_node.depth )
![Page 42: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/42.jpg)
since: “meeting the oracle” since: “a year before the movie”cooperates on: “The Nebuchadnezzar”
Graph traversals
import neo4jclass Friends(neo4j.Traversal): # Traversals ! queries in Neo4j
types = [ neo4j.Outgoing.KNOWS ]order = neo4j.BREADTH_FIRSTstop = neo4j.STOP_AT_END_OF_GRAPHreturnable = neo4j.RETURN_ALL_BUT_START_NODE
20
name: “Thomas Anderson”age: 29
name: “Morpheus”rank: “Captain”occupation: “Total badass”
name: “Trinity”
name: “Cypher”last name: “Reagan”
name: “Agent Smith”version: “1.0b”language: “C++”
name: “The Architect”
KNOWS
KNOWS
KNOWSKNOWS
KNOWS
CODED BYLOVES
disclosure: “secret”
disclosure: “public”
Morpheus (@ depth=1)
Trinity (@ depth=1)
Cypher (@ depth=2)
Agent Smith (@ depth=3)
for friend_node in Friends(mr_anderson):print "%s (@ depth=%s)" % ( friend_node["name"],
friend_node.depth )
![Page 43: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/43.jpg)
Finding a place to start๏Traversals need a Node to start from
•QUESTION: How do I find the start Node?
•ANSWER: You use an Index
๏ Indexes in Neo4j are different from Indexes in Relational Databases
•RDBMSes use them for Joining
•Neo4j use them for simple lookup
21
index = graphDb.index["name"]
mr_anderson = index["Thomas Anderson"]
performTraversalFrom( mrAnderson )
![Page 44: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/44.jpg)
Indexes in Neo4j๏The Graph *is* the main index
•Use relationship labels for navigation
•Build index structures *in the graph*
‣Search trees, tag clouds, geospatial indexes, et.c.
‣Linked/skip lists or other data structures in the graph
‣We have utility libraries for this
๏External indexes used *for lookup*
• Finding a (number of) points to start traversals from
•Major difference from RDBMS that use indexes for everything
22
![Page 45: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/45.jpg)
Django integration does all of this for you!
23
![Page 46: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/46.jpg)
Implementing the domain
24
user
blog
entry
comment
![Page 47: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/47.jpg)
from neo4j.model import django_model as models
25
blog
entry
comment
user
![Page 48: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/48.jpg)
from neo4j.model import django_model as models
25
blog
entry
comment
class User(models.NodeModel): username = models.Property(indexed=True) name = models.Property() blogs = models.Relationship(Blog, type=models.Outgoing.member_of, related_name="users") def __unicode__(self): return self.name
![Page 49: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/49.jpg)
from neo4j.model import django_model as models
26
user
entry
commentclass Blog(models.NodeModel): identifier = models.Property(indexed=True) title = models.Property() def __unicode__(self): return self.title
![Page 50: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/50.jpg)
from neo4j.model import django_model as models
27
user
blogcomment
class Entry(models.NodeModel): title = models.Property() text = models.Property() date = models.Property() blog = models.Relationship(Blog, type=models.Outgoing.posted_on, single=True, optional=False, related_name="articles") author = models.Relationship(User, type=models.Outgoing.authored_by, single=True, optional=False, related_name="articles")
![Page 51: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/51.jpg)
from neo4j.model import django_model as modelsmodels.pyclass Blog(models.NodeModel): identifier = models.Property(indexed=True) title = models.Property()
class User(models.NodeModel): username = models.Property(indexed=True) name = models.Property() blogs = models.Relationship(Blog, type=models.Outgoing.member_of, related_name="users")
class Entry(models.NodeModel): title = models.Property() text = models.Property() date = models.Property() blog = models.Relationship(Blog, type=models.Outgoing.posted_on, single=True, optional=False, related_name="articles") author = models.Relationship(User, type=models.Outgoing.authored_by, single=True, optional=False, related_name="articles") 28
The rest of the code for working with the domain objects is (mostly) the same as you are used to in Django.
![Page 52: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/52.jpg)
Why not use an O/R mapper?๏Model evolution in ORMs is a hard problem
• virtually unsupported in most ORM systems
๏SQL is “compatible” across many RDBMSs
• data is still locked in
๏Each ORM maps object models differently
•Moving to another ORM == legacy schema support
‣except your legacy schema is a strange auto-generated one
๏Object/Graph Mapping is always done the same way
• allows you to keep your data through application changes
• or share data between multiple implementations 29
![Page 53: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/53.jpg)
What an ORM doesn’t do
๏Deep traversals
๏Graph algorithms
๏Shortest path(s)
๏Routing
๏etc.
30
![Page 54: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/54.jpg)
Path exists in social network๏Each person has on average 50 friends
31
Database # persons query timeRelational databaseNeo4j Graph DatabaseNeo4j Graph DatabaseRelational database
1 000 2 000 ms1 000 2 ms
1 000 000 2 ms1 000 000 way too long...
Tobias
Emil
JohanPeter
The performance impact in Neo4j depends only on the degree of each node. in an RDBMS it depends on the number of entries in the tables involved in the join(s).
![Page 55: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/55.jpg)
Path exists in social network๏Each person has on average 50 friends
31
Database # persons query timeRelational databaseNeo4j Graph DatabaseNeo4j Graph DatabaseRelational database
1 000 2 000 ms1 000 2 ms
1 000 000 2 ms1 000 000 way too long...
Tobias
Emil
JohanPeter
The performance impact in Neo4j depends only on the degree of each node. in an RDBMS it depends on the number of entries in the tables involved in the join(s).
![Page 56: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/56.jpg)
๏20 million Nodes - represents places
๏62 million Edges - represents direct roads between places
•These edges have a length property, for the length of the road
๏Average optimal route, 100 separate roads, found in 100ms
๏Worst case route we could find:
•Optimal route is 5500 separate roads
•Total length ~770km
• Found in less than 3 seconds
๏Uses A* “best first” search
On-line real time routing with Neo4j
32
There’s a difference between least number of hops and least cost.
![Page 57: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/57.jpg)
Jython vs. CPython๏Neo4j with the Python bindings work in both
•Requires no code modification in your code
๏Neo4j at its core is an Embedded (in-process) database
•CPython manages concurrency by forking multiple processes
• Jython has full concurrency support in the same JVM
• Stand-alone Neo4j server-process with (C)Python clientis being worked on
๏Neo4j has a RESTful interface
•There are Python clients
•The API differs slightly (no transactions) 33
![Page 58: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/58.jpg)
Finding out more
34
๏http://neo4j.org/ - project website - main place for getting started
‣Contains screen casts, download links, et.c.
‣http://api.neo4j.org/ and http://components.neo4j.org/
‣Specifically http://components.neo4j.org/neo4j.py/
‣http://wiki.neo4j.org/ - HowTos, Tutorials, Examples, FAQ, et.c.
‣http://planet.neo4j.org/ - aggregation of blogs about Neo4j
‣http://github.com/neo4j-examples - small example applications
๏https://lists.neo4j.org/ - community mailing list
๏http://twitter.com/neo4j/team - follow the Neo4j team
๏http://neotechnology.com/ - commercial licensing
![Page 59: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/59.jpg)
Helping out!๏Neo4j and the Python integration is all Open Source
๏The Python bindings in particular would benefit from more devs...
• Integrate more of the Neo4j components
‣Neo4j Spatial
‣The Graph Algorithms package
‣The Graph Matching component
•Trimming off the rough edges in the Django integration
•Native client for CPython
35
![Page 60: Django and Neo4j - Domain modeling that kicks ass](https://reader033.fdocuments.in/reader033/viewer/2022051515/54c6c78b4a79593d7c8b46a5/html5/thumbnails/60.jpg)
Buzzword summary
36
AGPLv3 ACID transactions
Embedded
NOSQL
BeerA* routing
Open Source
Free Software
http://neo4j.org/
Software Transactional Memory
whiteboard friendly
Object mapping
Traversal
Query language
SPARQL
Scaling to complexity
Shortest path
Semi structured
Schema free
Polyglot persistence
RESTful
Gremlin