Mmh, I am not fluent in Python, so I would leave that to the experts. I think Tobias is going to crunch on the Python bindings VERY soon, so I guess there will be a good stream of awesomeness coming out from there. Watch the space in the coming weeks, or maybe there are others stepping up?
Cheers, /peter neubauer GTalk: neubauer.peter Skype peter.neubauer Phone +46 704 106975 LinkedIn http://www.linkedin.com/in/neubauer Twitter http://twitter.com/peterneubauer http://www.neo4j.org - Your high performance graph database. http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. On Tue, Feb 15, 2011 at 10:54 AM, Tom Smith <tom.sm...@york.ac.uk> wrote: > Hi Peter, > > I know it's completely cheeky, but I'd love python versions of example code > if possible... Even if it points at which bit of REST api I'd need to > implement... > > thanks > > Tom > > > > > On 14 Feb 2011, at 23:17, Peter Neubauer wrote: > >> Hi John, >> see the following example on something that should roughly work as you >> want. Notice that I only check for the existence of "relProp" on REL3, >> you can of course check for a value, but I didn't have a good example. >> >> This gives you the paths: >> >> (1)--[REL1,3]-->(2)--[REL2,4]-->(3)--[REL3,5]-->(4)--[REL4,6]-->(5) >> (1)--[REL1,7]-->(6)--[REL3,8]-->(7)--[REL4,10]-->(8)--[REL2,12]-->(9) >> >> Which is what you want - paths of length exactly 4, with unordered >> REL1, REL2, REL3, REL4 and a constraint on REL3? >> >> /peter >> >> >> package org.neo4j.examples.orderedpath; >> >> import static org.neo4j.graphdb.DynamicRelationshipType.withName; >> >> import java.util.ArrayList; >> >> import org.junit.BeforeClass; >> import org.junit.Test; >> import org.neo4j.graphdb.Direction; >> import org.neo4j.graphdb.Node; >> import org.neo4j.graphdb.Path; >> import org.neo4j.graphdb.Relationship; >> import org.neo4j.graphdb.RelationshipType; >> import org.neo4j.graphdb.Transaction; >> import org.neo4j.graphdb.traversal.Evaluation; >> import org.neo4j.graphdb.traversal.Evaluator; >> import org.neo4j.graphdb.traversal.TraversalDescription; >> import org.neo4j.graphdb.traversal.Traverser; >> import org.neo4j.kernel.EmbeddedGraphDatabase; >> import org.neo4j.kernel.Traversal; >> >> public class NonOrderedPathTest >> { >> private static EmbeddedGraphDatabase db; >> private static RelationshipType REL1 = withName( "REL1" ), >> REL2 = withName( "REL2" ), REL3 = withName( "REL3" ), >> REL4 = withName( "REL4" ), REL8 = withName( "REL8" ), >> REL9 = withName( "REL9" ), REL10 = withName( "REL10" ); >> >> @BeforeClass >> public static void createTheGraph() >> { >> db = new EmbeddedGraphDatabase( "target/db" ); >> Transaction tx = db.beginTx(); >> // START SNIPPET: createGraph >> Node A = db.createNode(); >> Node B = db.createNode(); >> Node C = db.createNode(); >> Node D = db.createNode(); >> Node E = db.createNode(); >> Node P = db.createNode(); >> Node Q = db.createNode(); >> Node R = db.createNode(); >> Node S = db.createNode(); >> Node T = db.createNode(); >> Node U = db.createNode(); >> Node X = db.createNode(); >> Node Y = db.createNode(); >> Node Z = db.createNode(); >> A.createRelationshipTo( X, REL1 ); >> X.createRelationshipTo( Y, REL2 ); >> Y.createRelationshipTo( Z, REL8 ); >> A.createRelationshipTo( B, REL1 ); >> B.createRelationshipTo( C, REL2 ); >> Relationship rel3 = C.createRelationshipTo( D, REL3 ); >> rel3.setProperty( "relProp", 123 ); >> D.createRelationshipTo( E, REL4 ); >> A.createRelationshipTo( P, REL1 ); >> Relationship rel33 = P.createRelationshipTo( Q, REL3 ); >> rel33.setProperty( "relProp", 123 ); >> Q.createRelationshipTo( R, REL9 ); >> Q.createRelationshipTo( R, REL4 ); >> R.createRelationshipTo( E, REL10 ); >> R.createRelationshipTo( S, REL2 ); >> S.createRelationshipTo( T, REL9 ); >> T.createRelationshipTo( U, REL8 ); >> >> tx.success(); >> tx.finish(); >> } >> >> @Test >> public void testPath() >> { >> TraversalDescription td = Traversal.description().expand( >> Traversal.expanderForTypes( REL1, Direction.OUTGOING, REL2, >> Direction.OUTGOING, REL3, Direction.OUTGOING, REL4, >> Direction.OUTGOING ) ).evaluator( new Evaluator() >> { >> >> public Evaluation evaluate( Path path ) >> { >> if ( path.length() == 0 ) >> { >> return Evaluation.EXCLUDE_AND_CONTINUE; >> } >> ArrayList<String> relTypes = new ArrayList<String>(); >> for(Relationship rel : path.relationships()) { >> String relname = rel.getType().name(); >> if(relname.equals( REL3.name() )) { >> if(rel.hasProperty( "relProp" )) { >> } else { >> return Evaluation.EXCLUDE_AND_PRUNE; >> } >> } >> if(!relTypes.contains( relname )) { >> relTypes.add( relname ); >> } else { >> return Evaluation.EXCLUDE_AND_PRUNE; >> } >> } >> return >> path.length()==4?Evaluation.INCLUDE_AND_CONTINUE:Evaluation.EXCLUDE_AND_CONTINUE; >> } >> } ); >> Traverser t = td.traverse( db.getNodeById( 1 ) ); >> for ( Path path : t ) >> { >> System.out.println( path ); >> } >> >> } >> } >> >> >> Cheers, >> >> /peter neubauer >> >> GTalk: neubauer.peter >> Skype peter.neubauer >> Phone +46 704 106975 >> LinkedIn http://www.linkedin.com/in/neubauer >> Twitter http://twitter.com/peterneubauer >> >> http://www.neo4j.org - Your high performance graph database. >> http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. >> >> >> >> On Mon, Feb 14, 2011 at 6:34 PM, John Howard <johnyho...@gmail.com> wrote: >>> Thanks Peter & Craig. >>> >>> There are no such constraints, that is, relationship types can reoccur if a >>> path satisfies the input criteria. >>> For ex: If there was another path in our graph example, say, >>> REL1 REL3 REL4 REL2 REL9 REL8 >>> A ---------> P ---------> Q -----------> R ---------> S >>> ---------->T----------->U >>> >>> we would like to see 2 paths, viz, A ->B->C->D-> E and A ->P->Q->R-> S >>> >>> I tried with the map suggestion, the prune logic doesn't seem to fit with >>> the existing evaluators. >>> Again, my understanding of the prune evaluators may be wrong. >>> Appreciate your help. >>> >>> Thank you. >>> >>> >>> On Mon, Feb 14, 2011 at 5:22 AM, Peter Neubauer < >>> peter.neuba...@neotechnology.com> wrote: >>> >>>> John, >>>> In your example, are there any constraints on that of the four >>>> relationship types, every one need to be exactly one time in the path, >>>> or is it just any of these? >>>> >>>> Instead of using a List like in the previous example, you can the use >>>> a Map to tick the visited relationship types and check the property >>>> when you get to REL3? I can do it for you in neo4j-examples again if >>>> you give me some more details :) >>>> >>>> Cheers, >>>> >>>> /peter neubauer >>>> >>>> GTalk: neubauer.peter >>>> Skype peter.neubauer >>>> Phone +46 704 106975 <+46704106975> >>>> LinkedIn http://www.linkedin.com/in/neubauer >>>> Twitter http://twitter.com/peterneubauer >>>> >>>> http://www.neo4j.org - Your high performance graph database. >>>> http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. >>>> >>>> >>>> >>>> On Sun, Feb 13, 2011 at 10:16 AM, John Howard <johnyho...@gmail.com> >>>> wrote: >>>>> Thanks Peter. That was very useful. >>>>> >>>>> I am trying to get the path A ->B->C->D-> E in the below graph, with the >>>>> following inputs >>>>> Start Node: A, >>>>> Relationships: REL1, REL4, REL2 (that is, order is not known) >>>>> Relationship Property: relProp= "abc" in REL3 >>>>> >>>>> I was not able to define an evaluator which takes the combination of >>>>> relationship types(without regard to order) and relationship properties >>>> to >>>>> return the desired path. >>>>> Can it be achievable in the current traversal framework? >>>>> >>>>> REL1 REL2 REL8 >>>>> A ---------> X ---------> Y -----------> Z >>>>> >>>>> REL1 REL2 REL3 REL4 >>>>> A ---------> B ---------> C -----------> D ---------> E >>>>> >>>>> REL1 REL3 REL9 REL10 >>>>> A ---------> P ---------> Q -----------> R ---------> E >>>>> >>>>> >>>>> As always, appreciate your guidance. >>>>> >>>>> >>>>> >>>>> ======================================================= >>>>> John, >>>>> if the order of the relationships doesn't matter, you could do >>>>> something like this with the Traversal API (holding an ordered Path to >>>>> test against in your Evaluator): >>>>> >>>>> public void testPath() >>>>> { >>>>> final ArrayList<RelationshipType> orderedPath = new >>>>> ArrayList<RelationshipType>(); >>>>> orderedPath.add( withName( "REL1" ) ); >>>>> orderedPath.add( withName( "REL2" ) ); >>>>> orderedPath.add( withName( "REL3" ) ); >>>>> orderedPath.add( withName( "REL4" ) ); >>>>> >>>>> TraversalDescription td = Traversal.description().evaluator( >>>>> new Evaluator() >>>>> { >>>>> >>>>> public Evaluation evaluate( Path path ) >>>>> { >>>>> if ( path.length() == 0 ) >>>>> { >>>>> return Evaluation.EXCLUDE_AND_CONTINUE; >>>>> } >>>>> String currentName= >>>>> path.lastRelationship().getType().name(); >>>>> String relationshipType = orderedPath.get( >>>>> path.length() - 1 ).name(); >>>>> if ( path.length() == orderedPath.size() ) >>>>> { >>>>> if ( currentName.equals( >>>>> relationshipType ) ) >>>>> { >>>>> return Evaluation.INCLUDE_AND_PRUNE; >>>>> } >>>>> else >>>>> { >>>>> return Evaluation.EXCLUDE_AND_PRUNE; >>>>> } >>>>> } >>>>> else >>>>> { >>>>> if ( currentName.equals( >>>>> relationshipType ) ) >>>>> { >>>>> return Evaluation.EXCLUDE_AND_CONTINUE; >>>>> } >>>>> else >>>>> { >>>>> return Evaluation.EXCLUDE_AND_PRUNE; >>>>> } >>>>> } >>>>> } >>>>> } ); >>>>> Traverser t = td.traverse( getNodeWithName( "A" ) ); >>>>> for ( Path path : t ) >>>>> { >>>>> System.out.println(path); >>>>> } >>>>> >>>>> } >>>>> >>>>> I am attaching the classes for your reference, so you have full code. >>>>> >>>>> Also, you could try JRuby, Gremlin or other along the same lines. But >>>>> this is a basic Java example in creating an ordered Path information >>>>> and checking against it during the traversal. You can add in more >>>>> stuff of course ... >>>>> >>>>> Cheers, >>>>> >>>>> /peter neubauer >>>>> >>>>> GTalk: neubauer.peter >>>>> Skype peter.neubauer >>>>> Phone +46 704 106975 <+46704106975> >>>>> LinkedIn http://www.linkedin.com/in/neubauer >>>>> Twitter http://twitter.com/peterneubauer >>>>> >>>>> http://www.neo4j.org - Your high performance graph >>>> database. >>>>> http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party. >>>>> >>>>> >>>>> >>>>> On Tue, Jan 25, 2011 at 10:59 PM, John Howard <johnyhowdy at gmail.com> >>>>> wrote: >>>>>> Hello, >>>>>> >>>>>> We are trying to use neo4j graph database in one of our applications. >>>>>> I think we hit a roadblock with traversal framework. It could be due to >>>>> our >>>>>> limited knowledge of neo4j framework. >>>>>> >>>>>> Here is what we are trying to accomplish: >>>>>> We need to get a path(from the graph below) from the nodes A to E >>>> through >>>>>> relations REL1, REL2, REL3 & REL4. >>>>>> All we know before the traversal is: Node A, REL1, REL2, REL3, >>>>>> REL4..(sometime we even know the end node E) >>>>>> So how can we get the path A to E? I can't seem to achieve it using >>>>>> evaluator and/or relationships in TraversalDescription. It always >>>> returns >>>>> me >>>>>> nodes X, P,Q since they have one my relationships(REL1, REL3). >>>>>> >>>>>> >>>>>> REL1 REL2 REL8 >>>>>> A ---------> X ---------> Y -----------> Z >>>>>> >>>>>> REL1 REL2 REL3 REL4 >>>>>> A ---------> B ---------> C -----------> D ---------> E >>>>>> >>>>>> REL1 REL3 REL9 REL10 >>>>>> A ---------> P ---------> Q -----------> R ---------> E >>>>>> >>>>>> >>>>>> Nodes: A, B, C, D,E,X,Y,Z,P,Q,R, >>>>>> Relations: REL1....REL10 >>>>>> >>>>>> >>>>>> Thank you for your help. >>>>>> >>>>>> John >>>>>> _______________________________________________ >>>>>> Neo4j mailing list >>>>>> User at lists.neo4j.org >>>>>> https://lists.neo4j.org/mailman/listinfo/user >>>>>> >>>>> -------------- next part -------------- >>>>> A non-text attachment was scrubbed... >>>>> Name: gist.zip >>>>> Type: application/zip >>>>> Size: 5718 bytes >>>>> Desc: not available >>>>> Url : >>>>> >>>> http://lists.neo4j.org/pipermail/user/attachments/20110126/f2e3cac5/attachment-0001.zip >>>>> _______________________________________________ >>>>> Neo4j mailing list >>>>> User@lists.neo4j.org >>>>> https://lists.neo4j.org/mailman/listinfo/user >>>>> >>>> _______________________________________________ >>>> Neo4j mailing list >>>> User@lists.neo4j.org >>>> https://lists.neo4j.org/mailman/listinfo/user >>>> >>> _______________________________________________ >>> Neo4j mailing list >>> User@lists.neo4j.org >>> https://lists.neo4j.org/mailman/listinfo/user >>> >> _______________________________________________ >> Neo4j mailing list >> User@lists.neo4j.org >> https://lists.neo4j.org/mailman/listinfo/user > > ------------------------------------------------------------------------ > Tom Smith: Collaborative Software Specialist > VC/ 011, Vanbrugh Building, University of York, YO10 5DD > mob: 07720 288285 tel: 01904 32 3847 > http://collaborate.york.ac.uk > http://www.york.ac.uk/it-services/groups/collab/ > http://bit.ly/toms-calendar > ------------------------------------------------------------------------ > > > > > > > > > > > > _______________________________________________ > Neo4j mailing list > User@lists.neo4j.org > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ Neo4j mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user