SlideShare una empresa de Scribd logo
1 de 240
Descargar para leer sin conexión
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
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)
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.
?
        ?
?
~$ cd /tmp/graphdb
graphdb$ gremlin
,,,/
         (o o)
-----o00o(_)-o00o-----
gremlin>
The Basics
Gremlin is a Groovy DSL and as such, has native JVM access.




'Gremlin is a Groovy DSL and as such, has native JVM access.'
3




1+2
gremlin




'gremlin'
emlin




'gremlin'.substring(2)
[1,2,3,4,5]




list = [1,2,3,4,5]
key1=value
               key2=123




map = [key1:'value',key2:123]
<modem sound/>




socket = new Socket('127.0.0.1',8182)
true




TextAnalysis.isMean('You are that which is not good.')
Graph Traversing
/tmp/graphdb




g = new Neo4jGraph('/tmp/graphdb')
/tmp/graphdb




g
1




g.v(1)
name=marko

              1




g.v(1).name
1




g.v(1)
city=santafe

                   1




g.v(1).city
1




g.v(1)
name=marko
          city=santafe

               1




g.v(1).map()
1




g.v(1)
created




              1    knows



                  knows




g.v(1).outE
created




              1    knows



                  knows




g.v(1).outE
null
                       created



                    since=2010
              1        knows


                    since=2005
                      knows




g.v(1).outE.since
created




              1    knows



                  knows




g.v(1).outE
2



                  created




              1   knows     3


                  knows



                            4
g.v(1).outE.inV
2   name=rexster



                       created




              1        knows     3   name=stephen


                       knows



                                 4   name=peter
g.v(1).outE.inV.name
/tmp/graphdb




g
1




g.v(1)
created




              1    knows



                  knows




g.v(1).outE
created




              1      knows



                    knows




g.v(1).outE[[label:'knows']]
1




g.v(1)
created




              1    knows



                  knows




g.v(1).outE
created




              1      knows



                    knows




g.v(1).outE.filter{it.label=='knows'}
2




g.v(1).outE.filter{it.label=='knows'}.count()
created




              1    knows



                  knows




g.v(1).outE
created




              1      knows



                    knows




g.v(1).outE.filter{it.label=='knows' & since > 2006}
[OutEdgesPipe, LabelFilterPipe(NOT_EQUAL,knows), InVertexPipe]




g.v(1).outE[[label:'knows']].inV.toString()
1




g.v(1)
1        knows


                       knows




g.v(1).outE('knows')
1     knows   3


                    knows


                            4

g.v(1).outE('knows').inV
[OutEdgesPipe(knows), InVertexPipe]




g.v(1).outE('knows').inV.toString()
1




g.v(1)
1       knows   3


                      knows


                              4

g.v(1).out('knows')
1     knows   3   name=stephen


                    knows


                            4   name=peter

g.v(1).out('knows').name
1     knows   3   name=stephen


                    knows


                            4   name=peter

g.v(1).out('knows').name.filter{it.startsWith('st')}
1     knows   3   name=stephen


                    knows


                            4   name=peter

g.v(1).out('knows').name.filter{it.matches('p.{4}')}
1     knows   3   name=stephen


                    knows


                            4   name=peter

g.v(1).out('knows').name.filter{it.matches('p.{4}') & false}
[OutPipe(knows)]




g.v(1).out('knows').toString()
1




g.v(1)
o   o!
                    o   oH
                   W


               1




g.v(1).filter{new Random().nextBoolean()}
1




g.v(1)
t!
                   A lrigh


               1




g.v(1).filter{new Random().nextBoolean()}
1




g.v(1)
Doh!

               1




g.v(1).filter{new Random().nextBoolean()}
1
1
1
1
Graph Inference
1




g.v(1)
2


                        created



               1




g.v(1).out('created')
2   name=rexster


                      created



               1




g.v(1).out('created').name
1




g.v(1)
2


                        created



               1




g.v(1).out('created')
2


                      created   created



               1                  3




g.v(1).out('created').in('created')
2


                      created   created



               1                  3




g.v(1).out('created').in('created').except([g.v(1)])
2


                      created   created



               1                  3       name=stephen




g.v(1).out('created').in('created').except([g.v(1)]).name
2


                      created   created



               1                  3       name=stephen




g.v(1).out('created').in('created').except([g.v(1)]).name.back(1)
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')}
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}
Graph Backtracking and Looping
1




g.v(1)
2


                        created



               1




g.v(1).out('created')
5

                                       imports


                                2      imports   6

                                       imports
                      created
                                                 7

               1




g.v(1).out('created').out('imports')
5   name=blueprints

                                       imports


                                2      imports   6   name=pipes

                                       imports
                      created
                                                 7   name=gremlin

               1




g.v(1).out('created').out('imports').name
5   name=blueprints

                                       imports


                                2      imports      6   name=pipes

                                       imports
                      created
                                                    7   name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1)
8

                                           imports

                                                     5      name=blueprints

                                        imports          imports
                                                                              imports
                                2       imports      6       name=pipes

                                        imports
                                                         imports
                      created
                                                     7       name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1).out('imports')
8

                                           imports

                                                     5      name=blueprints

                                        imports          imports
                                                                              imports
                                2       imports      6       name=pipes

                                        imports
                                                         imports
                      created
                                                     7       name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1).out('imports')
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1).out('imports').name
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1).out('imports').name
  .back(1)
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1).out('imports').name
  .back(1).out('imports')
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1).out('imports').name
  .back(1).out('imports').out('imports')
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').name.back(1).out('imports').name
  .back(1).out('imports').out('imports').out('imports')
name=neo4j       8

                               imports

                                         5      name=blueprints

                            imports          imports
                                                                  imports
                    2       imports      6       name=pipes

                            imports
                                             imports
    created
                                         7       name=gremlin

1
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                     imports

                                                               5      name=blueprints

                                                  imports          imports
                                                                                        imports
                                      2           imports      6       name=pipes

                                                  imports
                                                                   imports
                      created
                                                               7       name=gremlin

               1



                                              2




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                     imports

                                                               5      name=blueprints

                                                  imports          imports
                                                                                        imports
                                      2           imports      6       name=pipes

                                                  imports
                                                                   imports
                      created
                                                               7       name=gremlin

               1



                                              3




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                     imports

                                                               5      name=blueprints

                                                  imports          imports
                                                                                        imports
                                      2           imports      6       name=pipes

                                                  imports
                                                                   imports
                      created
                                                               7       name=gremlin

               1



                                              4




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('imports').loop(1){it.loops < 5}
m




m = [:]
m




           name=neo4j       8

                                   imports

                                             5      name=blueprints

                                imports          imports
                                                                      imports
                        2       imports      6       name=pipes

                                imports
                                                 imports
        created
                                             7       name=gremlin

    1
m




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
m




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
m




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=1
 m   v[6]=1
     v[7]=1




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=1
 m   v[6]=1
     v[7]=1




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=3
     v[6]=2
 m   v[7]=1
     v[8]=1




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=3
     v[6]=2
 m   v[7]=1
     v[8]=1




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=4
     v[6]=2
 m   v[7]=1
     v[8]=3




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=4
     v[6]=2
 m   v[7]=1
     v[8]=3




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=4
     v[6]=2
 m   v[7]=1
     v[8]=4




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
v[5]=4
     v[6]=2
 m   v[7]=1
     v[8]=4




                         name=neo4j       8

                                                 imports

                                                           5      name=blueprints

                                              imports          imports
                                                                                    imports
                                      2       imports      6       name=pipes

                                              imports
                                                               imports
                      created
                                                           7       name=gremlin

               1




g.v(1).out('created').out('import').groupCount(m).loop(2){true}
m




m = [:]
m




           name=neo4j       8

                                   imports

                                             5      name=blueprints

                                imports          imports
                                                                      imports
                        2       imports      6       name=pipes

                                imports
                                                 imports
        created
                                             7       name=gremlin

    1
m




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
m




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
m




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
m




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=1
 m     pipes=1
      gremlin=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=1
 m     pipes=1
      gremlin=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=1
 m     pipes=1
      gremlin=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=1
 m     pipes=1
      gremlin=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=3
       pipes=2
 m    gremlin=1
       neo4j=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=3
       pipes=2
 m    gremlin=1
       neo4j=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=3
       pipes=2
 m    gremlin=1
       neo4j=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=3
       pipes=2
 m    gremlin=1
       neo4j=1




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=4
       pipes=2
 m    gremlin=1
       neo4j=3




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=4
       pipes=2
 m    gremlin=1
       neo4j=3




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=4
       pipes=2
 m    gremlin=1
       neo4j=3




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=4
       pipes=2
 m    gremlin=1
       neo4j=3




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=4
       pipes=2
 m    gremlin=1
       neo4j=4




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=4
       pipes=2
 m    gremlin=1
       neo4j=4




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
blueprints=4
       pipes=2
 m    gremlin=1
       neo4j=4




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                    1




g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
Graph Paths
1




g.v(1)
1




g.v(1).as('x')
9                        10




            child       child




                    1




g.v(1).as('x').in('child')
9                        10




            child       child




                    1




g.v(1).as('x').in('child').loop('x')
child                    child




       9                         10




            child        child




                     1




g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
child                    child

             child                    child




       9                         10




            child        child




                     1




g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
child                    child

             child                    child

             child                    child




       9                         10




            child        child




                     1




g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
100,000,000                  100,000,001

                  child                        child
                   ...                          ...


                  child                        child

                  child                        child

                  child                        child




        9                             10




              child           child




                          1




g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
100,000,000                  100,000,001

                  child                        child
                   ...                          ...


                  child                        child

                  child                        child

                  child                        child




        9                             10




              child           child
                                           [v[1], v[9], ..., v[100,000,000]]
                                           [v[1], v[10], ..., v[100,000,001]]
                                           ...
                          1




g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}.paths
name=angelina                  name=brad

    100,000,000                  100,000,001

                  child                        child
                   ...                          ...


                  child                        child

                  child                        child

                  child                        child




        9                             10




              child           child




                          1




g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}.name
name=angelina                  name=brad

    100,000,000                  100,000,001

                  child                        child
                   ...                          ...


                  child                        child

                  child                        child

                  child                        child




        9                             10




              child           child
                                                 [v[1], v[9], ..., v[100,000,000], angelina]
                                                 [v[1], v[10], ..., v[100,000,001], brad]
                                                 ...
                          1




g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}.name.paths
1




g.v(1)
child       child




                    1




g.v(1).inE('child')
thinks="You suck."         thinks="You're great."

               child        child




                        1




g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}
thinks="You suck."

               child




                        1




g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}
9


   thinks="You suck."

               child




                        1




g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}.outV
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}
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}
Graph Pattern Matching
name=neo4j       8

                               imports

                                         5      name=blueprints

                            imports          imports
                                                                  imports
                    2       imports      6       name=pipes

                            imports
                                             imports
    created
                                         7       name=gremlin

1
SELECT ?x ?y WHERE {
  1 created ?x .
  ?x imports ?y
}


                   name=neo4j       8

                                           imports

                                                     5      name=blueprints

                                        imports          imports
                                                                              imports
                                2       imports      6       name=pipes

                                        imports
                                                         imports
                created
                                                     7       name=gremlin

          1
SELECT ?x ?y WHERE {
  1 created ?x .
  ?x imports ?y
}


                   name=neo4j       8

                                           imports

                                                     5      name=blueprints

                                        imports          imports
                                                                              imports
                                2       imports      6       name=pipes

                                        imports
                                                         imports
                created
                                                     7       name=gremlin

          1
SELECT ?x ?y WHERE {
  1 created ?x .
  ?x imports ?y
}


                   name=neo4j       8

                                           imports

                                                     5      name=blueprints

                                        imports          imports
                                                                              imports
                                2       imports      6       name=pipes

                                        imports
                                                         imports
                created
                                                     7       name=gremlin

          1
SELECT ?x ?y WHERE {                ?x     ?y
  1 created ?x .                    v[2]   v[5]
                                    v[2]   v[6]
  ?x imports ?y                     v[2]   v[7]
}


                   name=neo4j       8

                                              imports

                                                        5      name=blueprints

                                           imports          imports
                                                                                 imports
                                2          imports      6       name=pipes

                                           imports
                                                            imports
                created
                                                        7       name=gremlin

          1
name=neo4j       8

                               imports

                                         5      name=blueprints

                            imports          imports
                                                                  imports
                    2       imports      6       name=pipes

                            imports
                                             imports
    created
                                         7       name=gremlin

1
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()
t




                name=neo4j       8

                                        imports

                                                  5      name=blueprints

                                     imports          imports
                                                                           imports
                             2       imports      6       name=pipes

                                     imports
                                                      imports
             created
                                                  7       name=gremlin

         1




g.v(1)
t




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                1




g.v(1).out('created')
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')
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')
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')
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)
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)
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')
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')
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()
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()
t




                name=neo4j       8

                                        imports

                                                  5      name=blueprints

                                     imports          imports
                                                                           imports
                             2       imports      6       name=pipes

                                     imports
                                                      imports
             created
                                                  7       name=gremlin

         1




g.v(1)
t




                           name=neo4j       8

                                                   imports

                                                             5      name=blueprints

                                                imports          imports
                                                                                      imports
                                        2       imports      6       name=pipes

                                                imports
                                                                 imports
                        created
                                                             7       name=gremlin

                  1




g.v(1).out('created')
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')
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')
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')
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}
g.clear()
Graph Construction
1




a = g.addVertex()
name=pierre

             1




a.name = 'pierre'
name=pierre
         city=brussels

              1




a.city = 'brussels'
name=stephen
                                        city=dc

                                          2



         name=pierre
         city=brussels

              1




b = g.addVertex([name:'stephen',city:'dc'])
name=rexster
                    logo=   reXster
                                  .




                          3




                                      name=stephen
                                         city=dc

                                           2



         name=pierre
         city=brussels

              1




c = g.addVertex([name:'rexster',logo:[a12f04b312bc...]])
name=rexster
                    logo=   reXster
                                  .




                          3

                                        since=2011
                                      created
                                                name=stephen
                                                   city=dc

                                                     2



         name=pierre
         city=brussels

              1




g.addEdge(b,c,'created',[since:2011])
name=rexster
                     logo=   reXster
                                   .




                            3

                                         since=2011
                                       created
                                                 name=stephen
        since=2011                                  city=dc
                  reviews
                                                      2



         name=pierre
         city=brussels

              1




g.addEdge(a,c,'reviews',[since:2011])
name=gremlin
                                                   logo= Gremlin
                                                               G = (V, E)
                                                                            .




                                                           4
                      name=rexster
                                        imports
                     logo=   reXster
                                   .




                            3

                                         since=2011
                                       created
                                                  name=stephen
        since=2011                                   city=dc
                  reviews
                                                       2



         name=pierre
         city=brussels

              1




g.addEdge(c,g.addVertex([name:'gremlin',logo:[ab1346f47...]),'imports')
name=pipes
   logo=  Pipes.




        5
                                                         name=gremlin
                                                        logo= Gremlin
                                                                    G = (V, E)
                                                                                 .




              imports
                                                                4
                           name=rexster
                                             imports
                          logo=   reXster
                                        .




                                  3

                                              since=2011
                                            created
                                                       name=stephen
            since=2011                                    city=dc
                        reviews
                                                            2



            name=pierre
            city=brussels

                   1




g.addEdge(c,g.addVertex([name:'pipes',logo:[12cbef46...]]),'imports')
name=blueprints
   name=pipes                     logo= Blueprints .
   logo=  Pipes.



                                        6
        5
                                                              name=gremlin
                                                             logo= Gremlin
                                   imports
                                                                                      .


                                                                         G = (V, E)


              imports
                                                                     4
                           name=rexster
                                                  imports
                          logo=   reXster    .




                                   3

                                                   since=2011
                                                 created
                                                            name=stephen
            since=2011                                         city=dc
                        reviews
                                                                 2



            name=pierre
            city=brussels

                   1




g.addEdge(c,g.addVertex([name:'blueprints',logo:[f13cd1467...]]),'imports')
6
      5




                          4




              3




                      2




          1




g.V
6




g.V.count()
blueprints
     pipes




                                        gremlin




                      rexster




                                      stephen




             pierre




g.V.name
6
      5




                          4




              3




                      2




          1




g.V
Blueprints
       Pipes



                             Gremlin
                                 G = (V, E)




               reXster




g.V.logo
4




g.V.logo.count()
name=blueprints
   name=pipes
                            logo= Blueprints .
   logo=  Pipes
              .




                                                   name=gremlin
                                                  logo= Gremlin
                                                            G = (V, E)
                                                                         .




                       name=rexster
                      logo=   reXster
                                    .




                                                 name=stephen
                                                    city=dc




           name=pierre
           city=brussels




g.V.transform{it.map()}
6




g.V.transform{it.map()}.count()
7




g.V.transform{it.map()}.count() + 1
8




g.V.transform{it.map()}.count() + 1 + 1
4




(g.V.transform{it.map()}.count() + 1 + 1) / 2
4 is a number.




((g.V.transform{it.map()}.count() + 1 + 1) / 2) + ' is a number.'
14




(((g.V.transform{it.map()}.count() + 1 + 1) / 2) + ' is a number.').length()
imports
      imports



                                     imports




                                    created



                reviews




g.E
since=2011



        since=2011




g.E.transform{it.map()}
g.clear()
Graph Ranking
7        friend   6

                         friend                         friend


                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.loadGraphML('loopy-lou-and-the-loops.xml')
m


                            7        friend   6

                   friend                         friend


            8                                                5
                   friend   friend


          friend                                           friend
                                     friend


                                                  friend
            1                                                4


                   friend                         friend


                            2        friend   3




m = [:]
m


                              7        friend   6

                     friend                         friend
c       0

              8                                                5
                     friend   friend


            friend                                           friend
                                       friend


                                                    friend
              1                                                4


                     friend                         friend


                              2        friend   3




c = 0
m


                                  7        friend   6

                         friend                         friend
c     0

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
m


                                  7        friend   6

                         friend                         friend
c     0

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[2]=1
m    v[6]=1



                                  7        friend   6

                         friend                         friend
c      0

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[2]=1
m    v[6]=1



                                  7        friend   6

                         friend                         friend
c      2

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[2]=1
     v[3]=1
m    v[6]=2
     v[7]=1

                                  7        friend   6

                         friend                         friend
c      2

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[2]=1
     v[3]=1
m    v[6]=2
     v[7]=1

                                  7        friend   6

                         friend                         friend
c      5

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=1
     v[2]=1
     v[3]=1
m    v[4]=1
     v[6]=2
     v[7]=2
     v[8]=1
                                  7        friend   6

                         friend                         friend
c      5

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=1
     v[2]=1
     v[3]=1
m    v[4]=1
     v[6]=2
     v[7]=2
     v[8]=1
                                  7        friend   6

                         friend                         friend
c      9

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=3
     v[2]=2
     v[3]=1
     v[4]=1
m    v[5]=1
     v[6]=3
     v[7]=2
     v[8]=2                       7        friend   6

                         friend                         friend
c      9

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=3
     v[2]=2
     v[3]=1
     v[4]=1
m    v[5]=1
     v[6]=3
     v[7]=2
     v[8]=2                       7        friend   6

                         friend                         friend
c     15

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=4
     v[2]=4
     v[3]=3
     v[4]=1
m    v[5]=1
     v[6]=7
     v[7]=3
     v[8]=2                       7        friend   6

                         friend                         friend
c     15

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=4
     v[2]=4
     v[3]=3
     v[4]=1
m    v[5]=1
     v[6]=7
     v[7]=3
     v[8]=2                       7        friend   6

                         friend                         friend
c     25

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=5
     v[2]=5
     v[3]=5
     v[4]=3
m    v[5]=1
    v[6]=10
     v[7]=7
     v[8]=3                       7        friend   6

                         friend                         friend
c     25

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=5
     v[2]=5
     v[3]=5
     v[4]=3
m    v[5]=1
    v[6]=10
     v[7]=7
     v[8]=3                       7        friend   6

                         friend                         friend
c     39

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=5
     v[2]=5
     v[3]=5
     v[4]=3
m    v[5]=1
    v[6]=10
     v[7]=7
     v[8]=3                       7        friend   6

                         friend                         friend
c     39

                  8                                                5
                         friend   friend


                friend                                           friend
                                           friend


                                                        friend
                  1                                                4


                         friend                         friend


                                  2        friend   3




g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
v[1]=5
     v[2]=5
     v[3]=5
     v[4]=3
m    v[5]=1
    v[6]=10
     v[7]=7
     v[8]=3                      7        friend   6

                        friend                         friend
c     39

                 8                                                5
                        friend   friend


               friend                                           friend
                                          friend


                                                       friend
                 1                                                4


                        friend                         friend


                                 2        friend   3




println 'do you understand the concept of centrality?'
g.clear()
IDE Development




                                    reXster
            Command Line REPL   REST Server
Via any JVM language (JSR 223)




                                 Neo4j Server
http://gremlin.tinkerpop.com
The Pathology of Graph Databases
The Pathology of Graph Databases
The Pathology of Graph Databases
The Pathology of Graph Databases

Más contenido relacionado

La actualidad más candente

Designing with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf IndiaDesigning with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf IndiaNaresha K
 
Open Problems in the Universal Graph Theory
Open Problems in the Universal Graph TheoryOpen Problems in the Universal Graph Theory
Open Problems in the Universal Graph TheoryMarko Rodriguez
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureMike Fogus
 
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014Baruch Sadogursky
 
Cassandra Summit - What's New In Apache TinkerPop?
Cassandra Summit - What's New In Apache TinkerPop?Cassandra Summit - What's New In Apache TinkerPop?
Cassandra Summit - What's New In Apache TinkerPop?Stephen Mallette
 
ALE2014 let tests drive or let dijkstra derive
ALE2014 let tests drive or let dijkstra deriveALE2014 let tests drive or let dijkstra derive
ALE2014 let tests drive or let dijkstra deriveSanderSlideShare
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional ProgrammingDmitry Buzdin
 
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony CodeGroovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Codestasimus
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real Worldosfameron
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your GroovyAlonso Torres
 
Building Functional Islands
Building Functional IslandsBuilding Functional Islands
Building Functional IslandsMark Jones
 
SWP - A Generic Language Parser
SWP - A Generic Language ParserSWP - A Generic Language Parser
SWP - A Generic Language Parserkamaelian
 
Discovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic GroovyDiscovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic GroovyNaresha K
 
Project Gålbma – Actors vs Types
Project Gålbma – Actors vs TypesProject Gålbma – Actors vs Types
Project Gålbma – Actors vs TypesRoland Kuhn
 
Distributed algorithms for big data @ GeeCon
Distributed algorithms for big data @ GeeConDistributed algorithms for big data @ GeeCon
Distributed algorithms for big data @ GeeConDuyhai Doan
 
ETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDBETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDBMongoDB
 

La actualidad más candente (20)

Designing with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf IndiaDesigning with Groovy Traits - Gr8Conf India
Designing with Groovy Traits - Gr8Conf India
 
Open Problems in the Universal Graph Theory
Open Problems in the Universal Graph TheoryOpen Problems in the Universal Graph Theory
Open Problems in the Universal Graph Theory
 
Groovy
GroovyGroovy
Groovy
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of Clojure
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
 
Hammurabi
HammurabiHammurabi
Hammurabi
 
Cassandra Summit - What's New In Apache TinkerPop?
Cassandra Summit - What's New In Apache TinkerPop?Cassandra Summit - What's New In Apache TinkerPop?
Cassandra Summit - What's New In Apache TinkerPop?
 
ALE2014 let tests drive or let dijkstra derive
ALE2014 let tests drive or let dijkstra deriveALE2014 let tests drive or let dijkstra derive
ALE2014 let tests drive or let dijkstra derive
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional Programming
 
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony CodeGroovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real World
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy
 
Building Functional Islands
Building Functional IslandsBuilding Functional Islands
Building Functional Islands
 
SWP - A Generic Language Parser
SWP - A Generic Language ParserSWP - A Generic Language Parser
SWP - A Generic Language Parser
 
Discovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic GroovyDiscovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic Groovy
 
Project Gålbma – Actors vs Types
Project Gålbma – Actors vs TypesProject Gålbma – Actors vs Types
Project Gålbma – Actors vs Types
 
Distributed algorithms for big data @ GeeCon
Distributed algorithms for big data @ GeeConDistributed algorithms for big data @ GeeCon
Distributed algorithms for big data @ GeeCon
 
ETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDBETL for Pros: Getting Data Into MongoDB
ETL for Pros: Getting Data Into MongoDB
 

Similar a The Pathology of Graph Databases

Algebra 2 Unit 5 Lesson 5
Algebra 2 Unit 5 Lesson 5Algebra 2 Unit 5 Lesson 5
Algebra 2 Unit 5 Lesson 5Kate Nowak
 
Start Writing Groovy
Start Writing GroovyStart Writing Groovy
Start Writing GroovyEvgeny Goldin
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - StockholmJan Kronquist
 
7 Python udf.pptx
7 Python udf.pptx7 Python udf.pptx
7 Python udf.pptxSUJALORAON
 
(first '(Clojure.))
(first '(Clojure.))(first '(Clojure.))
(first '(Clojure.))niklal
 
The Ring programming language version 1.6 book - Part 62 of 189
The Ring programming language version 1.6 book - Part 62 of 189The Ring programming language version 1.6 book - Part 62 of 189
The Ring programming language version 1.6 book - Part 62 of 189Mahmoud Samir Fayed
 
A walk in graph databases v1.0
A walk in graph databases v1.0A walk in graph databases v1.0
A walk in graph databases v1.0Pierre De Wilde
 
The Ring programming language version 1.5.3 book - Part 69 of 184
The Ring programming language version 1.5.3 book - Part 69 of 184The Ring programming language version 1.5.3 book - Part 69 of 184
The Ring programming language version 1.5.3 book - Part 69 of 184Mahmoud Samir Fayed
 
The Ring programming language version 1.9 book - Part 69 of 210
The Ring programming language version 1.9 book - Part 69 of 210The Ring programming language version 1.9 book - Part 69 of 210
The Ring programming language version 1.9 book - Part 69 of 210Mahmoud Samir Fayed
 
The Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint LessonThe Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint LessonPaul Hawks
 
The Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint LessonThe Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint LessonPaul Hawks
 
Algebra 2 Section 5-2
Algebra 2 Section 5-2Algebra 2 Section 5-2
Algebra 2 Section 5-2Jimbo Lamb
 

Similar a The Pathology of Graph Databases (20)

Algebra 2 Unit 5 Lesson 5
Algebra 2 Unit 5 Lesson 5Algebra 2 Unit 5 Lesson 5
Algebra 2 Unit 5 Lesson 5
 
Start Writing Groovy
Start Writing GroovyStart Writing Groovy
Start Writing Groovy
 
Ca8e Ppt 6 1
Ca8e Ppt 6 1Ca8e Ppt 6 1
Ca8e Ppt 6 1
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
 
7 Python udf.pptx
7 Python udf.pptx7 Python udf.pptx
7 Python udf.pptx
 
(first '(Clojure.))
(first '(Clojure.))(first '(Clojure.))
(first '(Clojure.))
 
The Ring programming language version 1.6 book - Part 62 of 189
The Ring programming language version 1.6 book - Part 62 of 189The Ring programming language version 1.6 book - Part 62 of 189
The Ring programming language version 1.6 book - Part 62 of 189
 
A walk in graph databases v1.0
A walk in graph databases v1.0A walk in graph databases v1.0
A walk in graph databases v1.0
 
Htdp01
Htdp01Htdp01
Htdp01
 
1. functions
1. functions1. functions
1. functions
 
Basics
BasicsBasics
Basics
 
The Ring programming language version 1.5.3 book - Part 69 of 184
The Ring programming language version 1.5.3 book - Part 69 of 184The Ring programming language version 1.5.3 book - Part 69 of 184
The Ring programming language version 1.5.3 book - Part 69 of 184
 
125 7.7
125 7.7125 7.7
125 7.7
 
The Ring programming language version 1.9 book - Part 69 of 210
The Ring programming language version 1.9 book - Part 69 of 210The Ring programming language version 1.9 book - Part 69 of 210
The Ring programming language version 1.9 book - Part 69 of 210
 
Introduction to Groovy
Introduction to GroovyIntroduction to Groovy
Introduction to Groovy
 
PM5006 Week 6
PM5006 Week 6PM5006 Week 6
PM5006 Week 6
 
Ch10
Ch10Ch10
Ch10
 
The Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint LessonThe Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint Lesson
 
The Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint LessonThe Chain Rule Powerpoint Lesson
The Chain Rule Powerpoint Lesson
 
Algebra 2 Section 5-2
Algebra 2 Section 5-2Algebra 2 Section 5-2
Algebra 2 Section 5-2
 

Más de Marko Rodriguez

mm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic Machinemm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic MachineMarko Rodriguez
 
mm-ADT: A Multi-Model Abstract Data Type
mm-ADT: A Multi-Model Abstract Data Typemm-ADT: A Multi-Model Abstract Data Type
mm-ADT: A Multi-Model Abstract Data TypeMarko Rodriguez
 
Gremlin's Graph Traversal Machinery
Gremlin's Graph Traversal MachineryGremlin's Graph Traversal Machinery
Gremlin's Graph Traversal MachineryMarko Rodriguez
 
Quantum Processes in Graph Computing
Quantum Processes in Graph ComputingQuantum Processes in Graph Computing
Quantum Processes in Graph ComputingMarko Rodriguez
 
ACM DBPL Keynote: The Graph Traversal Machine and Language
ACM DBPL Keynote: The Graph Traversal Machine and LanguageACM DBPL Keynote: The Graph Traversal Machine and Language
ACM DBPL Keynote: The Graph Traversal Machine and LanguageMarko Rodriguez
 
The Gremlin Graph Traversal Language
The Gremlin Graph Traversal LanguageThe Gremlin Graph Traversal Language
The Gremlin Graph Traversal LanguageMarko Rodriguez
 
Faunus: Graph Analytics Engine
Faunus: Graph Analytics EngineFaunus: Graph Analytics Engine
Faunus: Graph Analytics EngineMarko Rodriguez
 
Solving Problems with Graphs
Solving Problems with GraphsSolving Problems with Graphs
Solving Problems with GraphsMarko Rodriguez
 
Titan: The Rise of Big Graph Data
Titan: The Rise of Big Graph DataTitan: The Rise of Big Graph Data
Titan: The Rise of Big Graph DataMarko Rodriguez
 
Traversing Graph Databases with Gremlin
Traversing Graph Databases with GremlinTraversing Graph Databases with Gremlin
Traversing Graph Databases with GremlinMarko Rodriguez
 
The Path-o-Logical Gremlin
The Path-o-Logical GremlinThe Path-o-Logical Gremlin
The Path-o-Logical GremlinMarko Rodriguez
 
The Gremlin in the Graph
The Gremlin in the GraphThe Gremlin in the Graph
The Gremlin in the GraphMarko Rodriguez
 
Memoirs of a Graph Addict: Despair to Redemption
Memoirs of a Graph Addict: Despair to RedemptionMemoirs of a Graph Addict: Despair to Redemption
Memoirs of a Graph Addict: Despair to RedemptionMarko Rodriguez
 
Graph Databases: Trends in the Web of Data
Graph Databases: Trends in the Web of DataGraph Databases: Trends in the Web of Data
Graph Databases: Trends in the Web of DataMarko Rodriguez
 
Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...
Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...
Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...Marko Rodriguez
 
A Perspective on Graph Theory and Network Science
A Perspective on Graph Theory and Network ScienceA Perspective on Graph Theory and Network Science
A Perspective on Graph Theory and Network ScienceMarko Rodriguez
 
The Graph Traversal Programming Pattern
The Graph Traversal Programming PatternThe Graph Traversal Programming Pattern
The Graph Traversal Programming PatternMarko Rodriguez
 
The Network Data Structure in Computing
The Network Data Structure in ComputingThe Network Data Structure in Computing
The Network Data Structure in ComputingMarko Rodriguez
 
A Model of the Scholarly Community
A Model of the Scholarly CommunityA Model of the Scholarly Community
A Model of the Scholarly CommunityMarko Rodriguez
 

Más de Marko Rodriguez (20)

mm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic Machinemm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic Machine
 
mm-ADT: A Multi-Model Abstract Data Type
mm-ADT: A Multi-Model Abstract Data Typemm-ADT: A Multi-Model Abstract Data Type
mm-ADT: A Multi-Model Abstract Data Type
 
Gremlin's Graph Traversal Machinery
Gremlin's Graph Traversal MachineryGremlin's Graph Traversal Machinery
Gremlin's Graph Traversal Machinery
 
Quantum Processes in Graph Computing
Quantum Processes in Graph ComputingQuantum Processes in Graph Computing
Quantum Processes in Graph Computing
 
ACM DBPL Keynote: The Graph Traversal Machine and Language
ACM DBPL Keynote: The Graph Traversal Machine and LanguageACM DBPL Keynote: The Graph Traversal Machine and Language
ACM DBPL Keynote: The Graph Traversal Machine and Language
 
The Gremlin Graph Traversal Language
The Gremlin Graph Traversal LanguageThe Gremlin Graph Traversal Language
The Gremlin Graph Traversal Language
 
The Path Forward
The Path ForwardThe Path Forward
The Path Forward
 
Faunus: Graph Analytics Engine
Faunus: Graph Analytics EngineFaunus: Graph Analytics Engine
Faunus: Graph Analytics Engine
 
Solving Problems with Graphs
Solving Problems with GraphsSolving Problems with Graphs
Solving Problems with Graphs
 
Titan: The Rise of Big Graph Data
Titan: The Rise of Big Graph DataTitan: The Rise of Big Graph Data
Titan: The Rise of Big Graph Data
 
Traversing Graph Databases with Gremlin
Traversing Graph Databases with GremlinTraversing Graph Databases with Gremlin
Traversing Graph Databases with Gremlin
 
The Path-o-Logical Gremlin
The Path-o-Logical GremlinThe Path-o-Logical Gremlin
The Path-o-Logical Gremlin
 
The Gremlin in the Graph
The Gremlin in the GraphThe Gremlin in the Graph
The Gremlin in the Graph
 
Memoirs of a Graph Addict: Despair to Redemption
Memoirs of a Graph Addict: Despair to RedemptionMemoirs of a Graph Addict: Despair to Redemption
Memoirs of a Graph Addict: Despair to Redemption
 
Graph Databases: Trends in the Web of Data
Graph Databases: Trends in the Web of DataGraph Databases: Trends in the Web of Data
Graph Databases: Trends in the Web of Data
 
Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...
Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...
Problem-Solving using Graph Traversals: Searching, Scoring, Ranking, and Reco...
 
A Perspective on Graph Theory and Network Science
A Perspective on Graph Theory and Network ScienceA Perspective on Graph Theory and Network Science
A Perspective on Graph Theory and Network Science
 
The Graph Traversal Programming Pattern
The Graph Traversal Programming PatternThe Graph Traversal Programming Pattern
The Graph Traversal Programming Pattern
 
The Network Data Structure in Computing
The Network Data Structure in ComputingThe Network Data Structure in Computing
The Network Data Structure in Computing
 
A Model of the Scholarly Community
A Model of the Scholarly CommunityA Model of the Scholarly Community
A Model of the Scholarly Community
 

Último

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 

Último (20)

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 

The Pathology of Graph Databases

  • 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.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8. ? ? ?
  • 9.
  • 12. ,,,/ (o o) -----o00o(_)-o00o----- gremlin>
  • 13.
  • 15. Gremlin is a Groovy DSL and as such, has native JVM access. 'Gremlin is a Groovy DSL and as such, has native JVM access.'
  • 16. 3 1+2
  • 20. key1=value key2=123 map = [key1:'value',key2:123]
  • 21. <modem sound/> socket = new Socket('127.0.0.1',8182)
  • 24. /tmp/graphdb g = new Neo4jGraph('/tmp/graphdb')
  • 27. name=marko 1 g.v(1).name
  • 29. city=santafe 1 g.v(1).city
  • 31. name=marko city=santafe 1 g.v(1).map()
  • 33. created 1 knows knows g.v(1).outE
  • 34. created 1 knows knows g.v(1).outE
  • 35. null created since=2010 1 knows since=2005 knows g.v(1).outE.since
  • 36. created 1 knows knows g.v(1).outE
  • 37. 2 created 1 knows 3 knows 4 g.v(1).outE.inV
  • 38. 2 name=rexster created 1 knows 3 name=stephen knows 4 name=peter g.v(1).outE.inV.name
  • 41. created 1 knows knows g.v(1).outE
  • 42. created 1 knows knows g.v(1).outE[[label:'knows']]
  • 44. created 1 knows knows g.v(1).outE
  • 45. created 1 knows knows g.v(1).outE.filter{it.label=='knows'}
  • 47. created 1 knows knows g.v(1).outE
  • 48. created 1 knows knows g.v(1).outE.filter{it.label=='knows' & since > 2006}
  • 51. 1 knows knows g.v(1).outE('knows')
  • 52. 1 knows 3 knows 4 g.v(1).outE('knows').inV
  • 55. 1 knows 3 knows 4 g.v(1).out('knows')
  • 56. 1 knows 3 name=stephen knows 4 name=peter g.v(1).out('knows').name
  • 57. 1 knows 3 name=stephen knows 4 name=peter g.v(1).out('knows').name.filter{it.startsWith('st')}
  • 58. 1 knows 3 name=stephen knows 4 name=peter g.v(1).out('knows').name.filter{it.matches('p.{4}')}
  • 59. 1 knows 3 name=stephen knows 4 name=peter g.v(1).out('knows').name.filter{it.matches('p.{4}') & false}
  • 62. o o! o oH W 1 g.v(1).filter{new Random().nextBoolean()}
  • 64. t! A lrigh 1 g.v(1).filter{new Random().nextBoolean()}
  • 66. Doh! 1 g.v(1).filter{new Random().nextBoolean()}
  • 67. 1
  • 68. 1
  • 69. 1
  • 70. 1
  • 73. 2 created 1 g.v(1).out('created')
  • 74. 2 name=rexster created 1 g.v(1).out('created').name
  • 76. 2 created 1 g.v(1).out('created')
  • 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}
  • 85. 2 created 1 g.v(1).out('created')
  • 86. 5 imports 2 imports 6 imports created 7 1 g.v(1).out('created').out('imports')
  • 87. 5 name=blueprints imports 2 imports 6 name=pipes imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name
  • 88. 5 name=blueprints imports 2 imports 6 name=pipes imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1)
  • 89. 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1).out('imports')
  • 90. 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1).out('imports')
  • 91. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1).out('imports').name
  • 92. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1).out('imports').name .back(1)
  • 93. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1).out('imports').name .back(1).out('imports')
  • 94. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1).out('imports').name .back(1).out('imports').out('imports')
  • 95. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').name.back(1).out('imports').name .back(1).out('imports').out('imports').out('imports')
  • 96. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 97. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 98. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 99. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 100. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 101. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 102. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 103. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 2 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 104. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 3 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 105. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 4 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 106. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('imports').loop(1){it.loops < 5}
  • 108. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 109. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 110. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 111. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 112. v[5]=1 m v[6]=1 v[7]=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 113. v[5]=1 m v[6]=1 v[7]=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 114. v[5]=3 v[6]=2 m v[7]=1 v[8]=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 115. v[5]=3 v[6]=2 m v[7]=1 v[8]=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 116. v[5]=4 v[6]=2 m v[7]=1 v[8]=3 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 117. v[5]=4 v[6]=2 m v[7]=1 v[8]=3 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 118. v[5]=4 v[6]=2 m v[7]=1 v[8]=4 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 119. v[5]=4 v[6]=2 m v[7]=1 v[8]=4 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').groupCount(m).loop(2){true}
  • 121. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 122. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 123. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 124. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 125. m name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 126. blueprints=1 m pipes=1 gremlin=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 127. blueprints=1 m pipes=1 gremlin=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 128. blueprints=1 m pipes=1 gremlin=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 129. blueprints=1 m pipes=1 gremlin=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 130. blueprints=3 pipes=2 m gremlin=1 neo4j=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 131. blueprints=3 pipes=2 m gremlin=1 neo4j=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 132. blueprints=3 pipes=2 m gremlin=1 neo4j=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 133. blueprints=3 pipes=2 m gremlin=1 neo4j=1 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 134. blueprints=4 pipes=2 m gremlin=1 neo4j=3 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 135. blueprints=4 pipes=2 m gremlin=1 neo4j=3 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 136. blueprints=4 pipes=2 m gremlin=1 neo4j=3 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 137. blueprints=4 pipes=2 m gremlin=1 neo4j=3 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 138. blueprints=4 pipes=2 m gremlin=1 neo4j=4 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 139. blueprints=4 pipes=2 m gremlin=1 neo4j=4 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 140. blueprints=4 pipes=2 m gremlin=1 neo4j=4 name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created').out('import').name.groupCount(m).back(2).loop(2){true}
  • 144. 9 10 child child 1 g.v(1).as('x').in('child')
  • 145. 9 10 child child 1 g.v(1).as('x').in('child').loop('x')
  • 146. child child 9 10 child child 1 g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
  • 147. child child child child 9 10 child child 1 g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
  • 148. child child child child child child 9 10 child child 1 g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
  • 149. 100,000,000 100,000,001 child child ... ... child child child child child child 9 10 child child 1 g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}
  • 150. 100,000,000 100,000,001 child child ... ... child child child child child child 9 10 child child [v[1], v[9], ..., v[100,000,000]] [v[1], v[10], ..., v[100,000,001]] ... 1 g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}.paths
  • 151. name=angelina name=brad 100,000,000 100,000,001 child child ... ... child child child child child child 9 10 child child 1 g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}.name
  • 152. name=angelina name=brad 100,000,000 100,000,001 child child ... ... child child child child child child 9 10 child child [v[1], v[9], ..., v[100,000,000], angelina] [v[1], v[10], ..., v[100,000,001], brad] ... 1 g.v(1).as('x').in('child').loop('x'){it.object.in.count() != 0}.name.paths
  • 154. child child 1 g.v(1).inE('child')
  • 155. thinks="You suck." thinks="You're great." child child 1 g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}
  • 156. thinks="You suck." child 1 g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}
  • 157. 9 thinks="You suck." child 1 g.v(1).inE('child').filter{TextAnalysis.isMean(it.thinks)}.outV
  • 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}
  • 161. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 162. SELECT ?x ?y WHERE { 1 created ?x . ?x imports ?y } name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 163. SELECT ?x ?y WHERE { 1 created ?x . ?x imports ?y } name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 164. SELECT ?x ?y WHERE { 1 created ?x . ?x imports ?y } name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 165. SELECT ?x ?y WHERE { ?x ?y 1 created ?x . v[2] v[5] v[2] v[6] ?x imports ?y v[2] v[7] } name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 166. name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1
  • 167. 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()
  • 168. t name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1)
  • 169. t name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created')
  • 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()
  • 179. t name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1)
  • 180. t name=neo4j 8 imports 5 name=blueprints imports imports imports 2 imports 6 name=pipes imports imports created 7 name=gremlin 1 g.v(1).out('created')
  • 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}
  • 188. name=pierre 1 a.name = 'pierre'
  • 189. name=pierre city=brussels 1 a.city = 'brussels'
  • 190. name=stephen city=dc 2 name=pierre city=brussels 1 b = g.addVertex([name:'stephen',city:'dc'])
  • 191. name=rexster logo= reXster . 3 name=stephen city=dc 2 name=pierre city=brussels 1 c = g.addVertex([name:'rexster',logo:[a12f04b312bc...]])
  • 192. name=rexster logo= reXster . 3 since=2011 created name=stephen city=dc 2 name=pierre city=brussels 1 g.addEdge(b,c,'created',[since:2011])
  • 193. name=rexster logo= reXster . 3 since=2011 created name=stephen since=2011 city=dc reviews 2 name=pierre city=brussels 1 g.addEdge(a,c,'reviews',[since:2011])
  • 194. name=gremlin logo= Gremlin G = (V, E) . 4 name=rexster imports logo= reXster . 3 since=2011 created name=stephen since=2011 city=dc reviews 2 name=pierre city=brussels 1 g.addEdge(c,g.addVertex([name:'gremlin',logo:[ab1346f47...]),'imports')
  • 195. name=pipes logo= Pipes. 5 name=gremlin logo= Gremlin G = (V, E) . imports 4 name=rexster imports logo= reXster . 3 since=2011 created name=stephen since=2011 city=dc reviews 2 name=pierre city=brussels 1 g.addEdge(c,g.addVertex([name:'pipes',logo:[12cbef46...]]),'imports')
  • 196. name=blueprints name=pipes logo= Blueprints . logo= Pipes. 6 5 name=gremlin logo= Gremlin imports . G = (V, E) imports 4 name=rexster imports logo= reXster . 3 since=2011 created name=stephen since=2011 city=dc reviews 2 name=pierre city=brussels 1 g.addEdge(c,g.addVertex([name:'blueprints',logo:[f13cd1467...]]),'imports')
  • 197. 6 5 4 3 2 1 g.V
  • 199. blueprints pipes gremlin rexster stephen pierre g.V.name
  • 200. 6 5 4 3 2 1 g.V
  • 201. Blueprints Pipes Gremlin G = (V, E) reXster g.V.logo
  • 203. name=blueprints name=pipes logo= Blueprints . logo= Pipes . name=gremlin logo= Gremlin G = (V, E) . name=rexster logo= reXster . name=stephen city=dc name=pierre city=brussels g.V.transform{it.map()}
  • 208. 4 is a number. ((g.V.transform{it.map()}.count() + 1 + 1) / 2) + ' is a number.'
  • 209. 14 (((g.V.transform{it.map()}.count() + 1 + 1) / 2) + ' is a number.').length()
  • 210. imports imports imports created reviews g.E
  • 211. since=2011 since=2011 g.E.transform{it.map()}
  • 214. 7 friend 6 friend friend 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.loadGraphML('loopy-lou-and-the-loops.xml')
  • 215. m 7 friend 6 friend friend 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 m = [:]
  • 216. m 7 friend 6 friend friend c 0 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 c = 0
  • 217. m 7 friend 6 friend friend c 0 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 218. m 7 friend 6 friend friend c 0 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 219. v[2]=1 m v[6]=1 7 friend 6 friend friend c 0 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 220. v[2]=1 m v[6]=1 7 friend 6 friend friend c 2 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 221. v[2]=1 v[3]=1 m v[6]=2 v[7]=1 7 friend 6 friend friend c 2 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 222. v[2]=1 v[3]=1 m v[6]=2 v[7]=1 7 friend 6 friend friend c 5 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 223. v[1]=1 v[2]=1 v[3]=1 m v[4]=1 v[6]=2 v[7]=2 v[8]=1 7 friend 6 friend friend c 5 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 224. v[1]=1 v[2]=1 v[3]=1 m v[4]=1 v[6]=2 v[7]=2 v[8]=1 7 friend 6 friend friend c 9 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 225. v[1]=3 v[2]=2 v[3]=1 v[4]=1 m v[5]=1 v[6]=3 v[7]=2 v[8]=2 7 friend 6 friend friend c 9 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 226. v[1]=3 v[2]=2 v[3]=1 v[4]=1 m v[5]=1 v[6]=3 v[7]=2 v[8]=2 7 friend 6 friend friend c 15 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 227. v[1]=4 v[2]=4 v[3]=3 v[4]=1 m v[5]=1 v[6]=7 v[7]=3 v[8]=2 7 friend 6 friend friend c 15 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 228. v[1]=4 v[2]=4 v[3]=3 v[4]=1 m v[5]=1 v[6]=7 v[7]=3 v[8]=2 7 friend 6 friend friend c 25 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 229. v[1]=5 v[2]=5 v[3]=5 v[4]=3 m v[5]=1 v[6]=10 v[7]=7 v[8]=3 7 friend 6 friend friend c 25 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 230. v[1]=5 v[2]=5 v[3]=5 v[4]=3 m v[5]=1 v[6]=10 v[7]=7 v[8]=3 7 friend 6 friend friend c 39 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 231. v[1]=5 v[2]=5 v[3]=5 v[4]=3 m v[5]=1 v[6]=10 v[7]=7 v[8]=3 7 friend 6 friend friend c 39 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 g.v(1).out.groupCount(m).loop(2){c++ < 35}.filter{false}
  • 232. v[1]=5 v[2]=5 v[3]=5 v[4]=3 m v[5]=1 v[6]=10 v[7]=7 v[8]=3 7 friend 6 friend friend c 39 8 5 friend friend friend friend friend friend 1 4 friend friend 2 friend 3 println 'do you understand the concept of centrality?'
  • 234. IDE Development reXster Command Line REPL REST Server
  • 235. Via any JVM language (JSR 223) Neo4j Server