SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
There is nothing more fascinating and utterly mind-bending than traversing a graph. Those who succumb to this data processing pattern euphorically suffer from graph pathology.
There is nothing more fascinating and utterly mind-bending than traversing a graph. Those who succumb to this data processing pattern euphorically suffer from graph pathology.
1.
The Pathology of Graph Databases
Marko A. Rodriguez
Graph Systems Architect
http://markorodriguez.com
http://twitter.com/twarko
http://tinkerpop.com
TinkerPop
WindyCityDB - Chicago, Illinois – June 25, 2011
2.
Abstract
There is nothing more fascinating and utterly mind-
bending than traversing a graph. Those who
succumb to this data processing pattern euphorically
suffer from graph pathology.
This is a case study of the Graph Addict.
Gremlin G = (V, E)
What is presented is as of Gremlin 1.1 (Released July 15, 2011)
3.
What you are about to see may disturb you.
It has infected
Neo4j, OrientDB, DEX, RDF Sail, TinkerGraph, and ReXster.
reXster
...it will infect others.
71.
2
created created
1 3
g.v(1).out('created').in('created')
72.
2
created created
1 3
g.v(1).out('created').in('created').except([g.v(1)])
73.
2
created created
1 3 name=stephen
g.v(1).out('created').in('created').except([g.v(1)]).name
74.
2
created created
1 3 name=stephen
g.v(1).out('created').in('created').except([g.v(1)]).name.back(1)
75.
2
created created
1 collaborator 3 name=stephen
g.v(1).out('created').in('created').except([g.v(1)]).name.back(1).
sideEffect{g.addEdge(g.v(1),it,'collaborator')}
76.
2
created created
1 collaborator 3 name=stephen
g.v(1).out('created').in('created').except([g.v(1)]).name.back(1).
sideEffect{g.addEdge(g.v(1),it,'collaborator')}.filter{false}
152.
irl."
ag
w like
thro
ou
ks="Y
thin
thinks="No pony!"
thi
n ks
="Y
ou
're
fat
."
thinks="Get a real job."
9
thinks="You suck."
child
1
g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}.outV.loop(3){true}
153.
irl."
ag
w like
thro
ou
ks="Y
thin
thinks="No pony!"
thi
n ks
="Y
ou
're
fat
."
thinks="Get a real job."
9
thinks="You suck."
child
1
g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}.outV.loop(3){true}
164.
t
name=neo4j 8
imports
5 name=blueprints
imports imports
x imports
2 imports 6 name=pipes
imports
imports
created
7 name=gremlin
1
g.v(1).out('created').as('x')
165.
t
name=neo4j 8
imports
5 name=blueprints
imports imports
x imports
2 imports 6 name=pipes
imports
imports
created
7 name=gremlin
1
g.v(1).out('created').as('x').out('imports')
166.
t
name=neo4j 8
imports
y
5 name=blueprints
imports y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
g.v(1).out('created').as('x').out('imports').as('y')
167.
x y
v[2] v[5]
t v[2] v[6]
v[2] v[7]
name=neo4j 8
imports
y
5 name=blueprints
imports y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
g.v(1).out('created').as('x').out('imports').as('y').table(t)
168.
x y
v[2] v[5]
t v[2] v[6]
v[2] v[7]
name=neo4j 8
imports
y
5 name=blueprints
v[5] imports y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
t.get(0,1)
169.
x y
v[2] v[5]
t v[2] v[6]
v[2] v[7]
name=neo4j 8
imports
y
5 name=blueprints
v[2] imports y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
t.get(0,'x')
170.
x y
v[2] v[5]
t v[2] v[6]
v[2] v[7]
name=neo4j 8
imports
y
5 name=blueprints
v[5]
v[6] imports
v[7]
y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
t.getColumn('y')
171.
x y
v[2] v[5]
t v[2] v[6]
v[2] v[7]
name=neo4j 8
imports
y
5 name=blueprints
[x, y] imports y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
t.getColumnNames()
172.
t
name=neo4j 8
imports
5 name=blueprints
imports imports
imports
2 imports 6 name=pipes
imports
imports
created
7 name=gremlin
1
t = new Table()
175.
t
name=neo4j 8
imports
5 name=blueprints
imports imports
x imports
2 imports 6 name=pipes
imports
imports
created
7 name=gremlin
1
g.v(1).out('created').as('x')
176.
t
name=neo4j 8
imports
5 name=blueprints
imports imports
x imports
2 imports 6 name=pipes
imports
imports
created
7 name=gremlin
1
g.v(1).out('created').as('x').out('imports')
177.
t
name=neo4j 8
imports
y
5 name=blueprints
imports y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
g.v(1).out('created').as('x').out('imports').as('y')
178.
x y
2 blueprints
t 2 pipes
2 gremlin
name=neo4j 8
imports
y
5 name=blueprints
imports y imports
x imports
2 imports 6 name=pipes
imports y imports
created
7 name=gremlin
1
g.v(1).out('created').as('x').out('imports').as('y').table(t){it.id}{it.name}