• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
An Introduction to Neo4j
 

An Introduction to Neo4j

on

  • 32,787 views

 

Statistics

Views

Total Views
32,787
Views on SlideShare
6,683
Embed Views
26,104

Actions

Likes
10
Downloads
240
Comments
1

19 Embeds 26,104

http://www.graph-database.org 23892
http://graphdb.jp 1832
http://paper.li 104
http://graphdbjp.tumblr.com 81
http://graph-databases.org 43
http://translate.googleusercontent.com 34
http://webcache.googleusercontent.com 30
https://twitter.com 22
http://a0.twimg.com 21
http://abtasty.com 12
http://us-w1.rockmelt.com 10
http://tweetedtimes.com 8
http://www.graph-databases.org 8
http://www.slideshare.net 2
http://fujohnwang.github.com 1
http://demo.apostrophenow.org 1
http://prlog.ru 1
http://www.graph-database.org.sixxs.org 1
http://www.graph-database.org&_=1333885391046 HTTP 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

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

11 of 1 previous next

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

    An Introduction to Neo4j An Introduction to Neo4j Presentation Transcript

    • Neo4j Product Overview
    • Neo4j Product Overview
    • NOSQL, The Web And The Enterprise
    • private static enum ExampleRelationshipTypes implementsRelationshipType{    EXAMPLE}GraphDatabaseService graphDb = new EmbeddedGraphDatabase( DB_PATH );registerShutdownHook( graphDb );graphDb.shutdown();
    • 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();}
    • 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" ) );    }}
    • 1 31 2
    • 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" ) );}
    • Traverser traverser = person.traverse(    Order.BREADTH_FIRST,    StopEvaluator.END_OF_GRAPH,    ReturnableEvaluator.ALL_BUT_START_NODE,    MyRelationshipTypes.KNOWS,    Direction.OUTGOING );for ( Node friend : traverser ){...}
    • /* 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();}
    • 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
    • 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
    • // 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
    • 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
    • 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
    • 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
    • [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"}
    • [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)
    • [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
    • [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)