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.
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.
77. 2
created created
1 3
g.v(1).out('created').in('created')
78. 2
created created
1 3
g.v(1).out('created').in('created').except([g.v(1)])
79. 2
created created
1 3 name=stephen
g.v(1).out('created').in('created').except([g.v(1)]).name
80. 2
created created
1 3 name=stephen
g.v(1).out('created').in('created').except([g.v(1)]).name.back(1)
81. 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')}
82. 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}
158. 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}
159. 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}
170. 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')
171. 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')
172. 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')
173. 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)
174. 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)
175. 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')
176. 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')
177. 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()
178. 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()
181. 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')
182. 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')
183. 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')
184. 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}