Your SlideShare is downloading. ×
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
An Introduction to Neo4j
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

An Introduction to Neo4j

32,658

Published on

Published in: Technology, Business
1 Comment
11 Likes
Statistics
Notes
No Downloads
Views
Total Views
32,658
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
247
Comments
1
Likes
11
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Neo4j Product Overview
  • 2. Neo4j Product Overview
  • 3. NOSQL, The Web And The Enterprise
  • 4. private static enum ExampleRelationshipTypes implementsRelationshipType{    EXAMPLE}GraphDatabaseService graphDb = new EmbeddedGraphDatabase( DB_PATH );registerShutdownHook( graphDb );graphDb.shutdown();
  • 5. Transaction tx = graphDb.beginTx();try{    Node firstNode = graphDb.createNode();    firstNode.setProperty( NAME_KEY, "Hello" );    Node secondNode = graphDb.createNode();    secondNode.setProperty( NAME_KEY, "World" );     firstNode.createRelationshipTo( secondNode,        ExampleRelationshipTypes.EXAMPLE );     String greeting = firstNode.getProperty( NAME_KEY ) + " "        + secondNode.getProperty( NAME_KEY );    System.out.println( greeting );    tx.success();}finally{    tx.finish();}
  • 6. private void printFriends( Node person ){    Traverser traverser = person.traverse(        Order.BREADTH_FIRST, //        StopEvaluator.END_OF_GRAPH, // Graph        ReturnableEvaluator.ALL_BUT_START_NODE,        MyRelationshipTypes.KNOWS, // ”KNOWS”        Direction.OUTGOING ); //    for ( Node friend : traverser )    { // Node ”name”        System.out.println( friend.getProperty( "name" ) );    }}
  • 7. 1 31 2
  • 8. private static Traverser findHackers( final Node startNode ){    TraversalDescription td = Traversal.description()            .breadthFirst()            .relationships( RelTypes.CODED_BY, Direction.OUTGOING )            .relationships( RelTypes.KNOWS, Direction.OUTGOING )            .evaluator(                    Evaluators.returnWhereLastRelationshipTypeIs(RelTypes.CODED_BY ) );    return td.traverse( startNode );}Traverser traverser = findHackers( getNeoNode() );int numberOfHackers = 0;for ( Path hackerPath : traverser ){    System.out.println( "At depth " + hackerPath.length() + " => "                        + hackerPath.endNode()                                .getProperty( "name" ) );}
  • 9. Traverser traverser = person.traverse(    Order.BREADTH_FIRST,    StopEvaluator.END_OF_GRAPH,    ReturnableEvaluator.ALL_BUT_START_NODE,    MyRelationshipTypes.KNOWS,    Direction.OUTGOING );for ( Node friend : traverser ){...}
  • 10. /* 1. Begin a transaction. 2. Operate on the graph. 3. Mark the transaction as successful (or not). 4. Finish the transaction.*/Transaction tx = graphDb.beginTx();try{ ... // any operation that works with the node space tx.success();}finally{ tx.finish();}
  • 11. Graph Databases and Endogenous Indices name property indexviews property index gender property index name=neo4j views=56781 page_rank=0.023 cites cites name=tenderlove gender=male created created created date=2007/10 cites follows follows created name=peterneubauer follows name=graph_blog follows views=1000 follows created name=ahzf name=twarko age=30
  • 12. GraphDatabaseService graphDb = newEmbeddedGraphDatabase( "path/to/neo4j-db" );IndexService index = new LuceneIndexService( graphDb );Node andy = graphDb.createNode();Node larry = graphDb.createNode();andy.setProperty( "name", "Andy Wachowski" );andy.setProperty( "title", "Director" );larry.setProperty( "name", "Larry Wachowski" );larry.setProperty( "title", "Director" );index.index( andy, "name", andy.getProperty( "name" ) );index.index( andy, "title", andy.getProperty( "title" ) );index.index( larry, "name", larry.getProperty( "name" ) );index.index( larry, "title", larry.getProperty( "title" ) ); http://wiki.neo4j.org/content/Indexing_with_IndexService
  • 13. // Return the andy node.index.getSingleNode( "name", "Andy Wachowski" );// Containing only the larry nodefor ( Node hit : index.getNodes( "name", "Larry Wachowski" ) ){ // do something}// Containing both andy and larryfor ( Node hit : index.getNodes( "title", "Director" ){ // do something} http://wiki.neo4j.org/content/Indexing_with_IndexService
  • 14. IndexService index = // your LuceneFulltextIndexServiceindex.getNodes( "name", "wachowski" ); // --> andy and larryindex.getNodes( "name", "andy" ); // --> andyindex.getNodes( "name", "Andy" ); // --> andyindex.getNodes( "name", "larry Wachowski" ); // --> larryindex.getNodes( "name", "wachowski larry" ); // --> larryindex.getNodes( "name", "wachow* andy" ); // --> andy and larryindex.getNodes( "name", "Andy" ); // --> andyindex.getNodes( "name", "andy" ); // --> andyindex.getNodes( "name", "wachowski" ); // --> andy and larryindex.getNodes( "name", "+wachow* +larry" ); // --> larryindex.getNodes( "name", "andy AND larry" ); // -->index.getNodes( "name", "andy OR larry" ); // --> andy and larryindex.getNodes( "name", "Wachowski AND larry" ); // --> larry http://wiki.neo4j.org/content/Indexing_with_IndexService
  • 15. of a spatial, 2D-index that is explicitly14 Marko A.within a Peter Neubauer modeled Rodriguez and 1 2 In order to demonstrate how a quadtree index can be represented anpatial analysis makes use of advanced indexing structuresis represents a quadtreeset is diagrammed i versed, a toy graph data set presented. This data ure 8. The top half of Figure 8 index (vertices 1-9) [4, 17]. Quadtrees partition a two-dimensional plane into sed upon the spatial density of the points being indexed. type=quadow space is partitioned as the density of points increases bl=[0,0] tr=[100,100] e index. 1 sub sub type=quad type=quad type=quad bl=[0,0] 2 3 bl=[50,25] 4 bl=[50,0] tr=[50,100] tr=[75,50] tr=[100,100] type=quad type=quad bl=[0,0] bl=[50,50] tr=[50,50] tr=[100,100] type=quad type=quad bl=[0,50] 5 6 9 7 8 bl=[50,0] tr=[50,100] tr=[100,50] type=quad [0,100] 1 bl=[50,25] [100,100] tr=[62,37] g f a b e 5 7 9 bl=[25,20] d 3 h c tr=[90,45]artition of a plane. This figure is an adaptation of a public id courtesy of David Eppstein. 6 2 4 8 [100,0] [0,0] motivations behind this article is to stress the A quadtree index ofof space that contains points of interest. The in Fig. 8. importance a
  • 16. TraversalDescription description = Traversal.description() .breadthFirst() .relationships(Relationships.PAIRED, Direction.OUTGOING) .evaluator(Evaluators.excludeStartPosition());description.traverse( startNode ); // Retrieves the traverserstart programmer=(3) match (programmer)-[:PAIRED]->(pair) return pairstart programmer=(3) match (programmer)-[:PAIRED]->(pair)where pair.age > 30 return pair, count(*) order by ageskip 5 limit 10
  • 17. [InComing/Outgoing relationships] # All nodes that A has outgoing relationships to. > start n=node(3) match (n)-->(x) return x ==> Node[4]{name->"Bossman"} ==> Node[5]{name->"Cesar"} > start n=node(3) match (n)<--(x) return x ==> Node[1]{name->David"}[Match by relationship type]# All nodes that are Blocked by A.> start n=node(3) match (n)-[:BLOCKS]->(x) return x==> Node[5]{name->"Cesar"}[Multiple relationships]# The three nodes in the path.> start a=node(3) match (a)-[:KNOWS]->(b)-[:KNOWS]->(c) return a,b,c==> a: Node[3]{name->"Anders"}==> b: Node[4]{name->"Bossman"}==> c: Node[2]{name->"Emil"}
  • 18. [Shortest path]# : find the shortest path between two nodes, as long as the path is max 15relationships long. Inside of the parenthesis you can write> start d=node(1), e=node(2) match p = shortestPath( d-[*..15]->e ) return p==> p: (1)--[KNOWS,2]-->(3)--[KNOWS,0]-->(4)--[KNOWS,3]-->(2)
  • 19. [Count/ Group Count]> start n=node(2) match (n)-->(x) return n, count(*)# The start node and the count of related nodes.==>n: Node[2]{name->"A",property->13}count(*): 3> start n=node(2) match (n)-[r]->() return type(r), count(*)# The relationship types and their group count.==>TYPE(r): KNOWScount(*): 3
  • 20. [SUM/AVG/MAX/COLLECT]> start n=node(2,3,4) return sum(n.property)==> 90> start n=node(2,3,4) return avg(n.property)==> 30.0> start n=node(2,3,4) return max(n.property)==> 44> start n=node(2,3,4) return collect(n.property)==> List(13, 33, 44)

×