Then, you would like to get all the paths that containing any number of single occurrences of REL1...REL4?
In that case, I would from the current end of the path, look one relationship further (path.endNode().getRelationships()), and EXCLUDE_CONTINUE include the path if the at least one of the next relationships will fit your criteria (e.g. you can go one hop further). If not, return INCLUDE_PRUNE, meaning that this path is already the longest you can go with the constraints. Does that make sense? 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 Thu, Feb 17, 2011 at 12:15 AM, John Howard <johnyho...@gmail.com> wrote: > Thanks Peter. Really appreciate your help. > > Yes, in somecases the path is exactly 4. > But in others, it may not be. I am wondering what would be the prune > criterion if the path is not exactly 4. > Say, > > REL1 REL2 REL3 > A ---------> P ---------> Q -----------> T > > And I would like to get A->P->Q->T returned as a path along the with > previous 2 paths. > > > On Mon, Feb 14, 2011 at 6:17 PM, Peter Neubauer < > peter.neuba...@neotechnology.com> 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 >> > _______________________________________________ > 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