• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
A gremlin in my graph confoo 2014
 

A gremlin in my graph confoo 2014

on

  • 480 views

Neo4j comes with enhanced connectivity of data and whiteboard friendly paradigm. It also brings a gremlin in your code : one of the supported graph query language brings a refreshing look at how one ...

Neo4j comes with enhanced connectivity of data and whiteboard friendly paradigm. It also brings a gremlin in your code : one of the supported graph query language brings a refreshing look at how one can search for data in a vast and interconnect web of data. Gremlin provides an abstract layer that make it easy to express your business logic without fighting with the code. It may even change your mind on object oriented programming.

Statistics

Views

Total Views
480
Views on SlideShare
461
Embed Views
19

Actions

Likes
2
Downloads
5
Comments
0

1 Embed 19

https://twitter.com 19

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    A gremlin in my graph confoo 2014 A gremlin in my graph confoo 2014 Presentation Transcript

    • A gremlin in your graph in your graph Montreal, Québec, Canada, February, 28th 2014
    • What is gremlin? G : graph, or the dataset V : Vertices, or nodes or objects E : Edges, or links or relations
    • graph database, http://www.neo4j.org/
    • Speaker Damien Seguy dams@php.net Exakat : Expert services in PHP
    • Yes we take questions ?
    • Graph Database http://www.neo4j.org/ http://localhost:7474/ Console -> Gremlin ==> ==> ,,,/ ==> (o o) ==> -----oOOo-(_)-oOOo----==> ==> Available variables: ==> g = (neo4jgraph[EmbeddedGraphDatabase [data/graph.db]] ==> , null) out = (java.io.PrintStream@398a3257 ==> , null) gremlin> Console in web browser!
    • Welcome to the graph g is the graph where the nodes live v represents all the vertices g.v(1) => Nodes always have an id v(1)
    • Properties Graph is schemaless g.v(1).id => 1 g.v(1).name => ext/datetime g.v(1).version => null
    • Node discovery g.v(2).map => {name=timezonedb, version=2013.9} map is convenient to discover the graph
    • In the graph Only objects and relations Vertices have id and properties Edges have id, label and properties
    • Edges g.v(1).in => v(4) g.v(1).out => v(2) v(3) g.v(1).both => v(2) v(3) v(4) Directed graph
    • g.v(1).inE.id => 2 3 4 8 g.v(1).inE.label => WROTE WROTE WROTE HAS
    • PECL database database of PHP extension authors. The extensions are stored in categories http://pecl.php.net/ Gephi
    • Following edges g.v(1).in(‘WROTE’).name => Derick Rethans Hannes Magnusson Jeremy Mikola g.v(1).in(‘WROTE’,‘HAS’).name => /*same as previous plus */ DB
    • Collaborators g.v(2).out(‘WROTE’).in(‘WROTE’).name => Hannes Magnusson Jeremy Mikola Derick Rethans
    • Collaborators g.v(2).out(‘WROTE’).in(‘WROTE’). except(g.v(2)).name => Hannes Magnusson Jeremy Mikola
    • Intro recap nodes and vertices : basic blocs in and out (and both) : navigation except(), in(‘label’) : filtering
    • Traversing the graph Means reading information in the graph Traversing involves listing nodes then following links until all conditions are met The graph contains Vertices and Edges. Is there anything else ?
    • PECL database Authors Ext Categories
    • Count authors count() All vertices are created equal
    • Count contributors g.V.out(‘wrote’) .count() => 5 Too manys!
    • Arrays or pipes g.V.out(‘wrote’)[1] v(12) g.V.out(‘wrote’)[1..2] .name ext/xdebug ext/mongo
    • Count contributors g.V.in(‘wrote’) .unique() .count()==> 3
    • Gremlin functions Pipe level function in, out, unique, count, Node level function map, has, filter{} Value level {property}
    • Property level // making name UPPERCASE g.v(79).name.toUpperCase(); EXT/GEARMAN // size of the name’s string g.v(130).name.toList().size(); 13 // extracting words http://groovy.codehaus.o in a string Documentation g.v(146).transform{ it.name.tokenize();} [Johann-Peter, Hartmann]
    • Vertex level g.v(130).map; {name=Ben Ramsey} g.v(14).propertykeys name g.v(12).setProperty(‘ext_nb’, g(12).out(‘wrote’).count() );
    • Collaborating Adding collaborators to the graph g.addEdge( g.v(1), g.v(1).out(‘WROTE’). in(‘WROTE’). except(g.v(1)), ‘COLLABORATE’); ==> No signature of method: com.tinkerpop.gremlin.groovy.GremlinGro ovyPipeline.except() is applicable for argument types: (com.tinkerp op.blueprints.pgm.impls.neo4j.Neo4jVertex) values: [v[1]] ==> Possible solutions: except(java.util.Collection), select(), next(), reset(), cap(), toSet() Except() produces a pipe! g.addedge doesn’t accept it
    • Collaborating Adding collaborator g.addEdge( g.v(1), g.v(1).out(‘WROTE’). in(‘WROTE’). except(g.v(1)).next(), ‘COLLABORATE’); Adding collaborators g.v(1).out(‘WROTE’).in(‘WROTE’).except(g.v(1)).each{ g.addEdge(g.v(1), it, ‘COLLABORATE’) } wonderful world of closures
    • Working with pipes Pipes functions often offer possibility for closure Closure is between {} and uses ‘it’ as current node Closure often have a standard default behavior, so they are sometimes stealth
    • Filtering filter links by label (in/out/both(‘label’)) Filter node with has(‘property’, ‘value’) or hasNot(‘property’, null) Filter authors with 14 or more extensions g.V.in(‘WROTE’).filter{it.out(‘WROTE’).count() > 14} Ilia Alshanetsky, Wez Furlong, Sara Golemon Filter allows us to work within the pipe
    • Filtering List of contributors with more ext in two categories g.V.in(‘wrote’).filter{ it.out(‘wrote’).in(‘has’).unique().count() > 2 }.name Filter longer than query ?
    • GroupCount groupCount(m) Number of categories by author g.V.out(‘wrote’).in(‘has’).groupCount(m) Apparently counted but who is v(274) ? ==> v[380]=1= v[379]=1==> v[378]=2==> v[273]=2==> v[274]=2==> v[272]=2==> v[173]=3==> v[240]=2==>
    • GroupCount g.V.out(‘has’) .in(‘wrote’) .groupCount(m) Georg Richter =2==> Warren Read =2==> Jay Kint =2==> shekhar euvel =1==>{it.name} Grant Croker =1
    • GroupCount Count of categories, without PHP standard distribution The second closure counts elements (default +1) g.V.has(‘wrote’) .in(‘has’) .groupCount(m) {it.name} {if (!it.name in [‘mysql’, ‘timezonedb’,’gd’, ‘dbase’ /* ....*/]) { it.b + 1;} }
    • Pipes array notation closure usage useful function for pipes : groupcount, groupby{key}{value}{mapreduce}, ordermap, [n..m] operator, More on http://gremlindocs.com/
    • Graph modifications Gremlin allows graph modification Adding a type property to authors g.V.in(‘WROTE’).each{ it.setProperty(‘type’, ‘author’); }
    • Updating on the way sideEffect runs a closure, but keep running the query Adding type to extensions AND categories in the same query g.V.as(‘ext’) .in(‘HAS’) .sideEffect{ it.setProperty(‘type’, ‘Category’); .back(‘ext’) .sideEffect{ it.setProperty(‘type’, ‘Extension’); } }
    • back tracking back( ‘name’ ) : goes back to the vertex or edge that was named with as(‘name’) back( n ) : goes back n vertex or edges behind Make is possible to check a branch, come back and check another branch
    • Manipulating vertex g.addVertex(id or null, [property:value,...]); g.addEdge(origin vertex, destination vertex, label, [property:value...]); g.removeVertex(vertex); g.removeEdge(edge);
    • Application to OOP? Gremlin goes beyond class specifics g.v(1).out(‘WROTE’).in(‘HAS’).unique().count() $total = array(); $author = new Author(1);foreach($author>getExtensions() as $ext) { $total[$ext->getCategory()] = true;} return count($total); return count($total); Gremlin generalizes the navigation
    • Thanks Dams@php.net http://www.slideshare.net/dseguy/ on the http://confoo.ca/
    • Kevin Bacon Suggest collaborators to authors ? Authors who worked with collaborators but not with the author, are recommendations g.V.has(‘name’, ‘contrib’).sideEffect{init = it}out(‘wrote’).in(‘wrote’).except(init).has(‘name’,‘con trib2’).path