+1, I think a "Traversal Context" would be of great help. May be the thoughts have to be more refined as to how the API can expose the context in a intuitive manner.
On Thu, Dec 23, 2010 at 9:57 PM, David Montag <david.mon...@neotechnology.com> wrote: > Hi, > > Mattias, your solution works because Amos' algo was a special case where you > can verify the path simply by looking one step back. It's a smart solution > to his problem! > > However, what about traversals where you have more complex calculations > going on and essentially want to carry a state along with you from hop to > hop. That state would be different for each traversal branch. Is that > something the traversal API should support? Community, WDYT? (sorry for > thread hijack) > > David > > On Thu, Dec 23, 2010 at 12:48 PM, Mattias Persson <matt...@neotechnology.com >> wrote: > >> Hi, interesting traversal... so you're saying that paths like this could be >> returned: >> >> (start)-B->()-A[P=1]->()-A[P=1]->()-B->(end) >> >> but not paths like this: >> >> (start)-A[P=1]->()-B->()-A[P=2]->(end) >> >> am I correct? There are common path algorithms in >> GraphAlgoFactory< >> http://components.neo4j.org/neo4j-graph-algo/apidocs/org/neo4j/graphalgo/GraphAlgoFactory.html >> >but >> they don't support an evaluator as an argument, an evaluator which >> could >> look like: >> >> { >> public Evaluation evaluate( Path position ) >> { >> Relationship rel = position.lastRelationship(); >> if ( rel == null || !rel.isType( MyRelTypes.A ) ) >> return Evaluation.INCLUDE_AND_CONTINUE; >> >> Object p = rel.getProperty( "P" ); >> Object previousP = lookBackwardsForP( position ); >> if ( previousP != null && !p.equals( previousP ) ) >> return Evaluation.EXCLUDE_AND_PRUNE; >> return Evaluation.INCLUDE_AND_CONTINUE; >> } >> >> private Object lookBackwardsForP( Path position ) >> { >> int count = 0; >> for ( Relationship rel : position.relationships() ) >> { >> // Skip the first one >> if ( count++ > 0 ) >> { >> if ( rel.isType( MyRelTypes.A ) ) >> return rel.getProperty( "P" ); >> } >> } >> return null; >> } >> } >> >> You could probably create a breadth first traverser with such an evaluator >> to get your paths. I don't know about performance since each evaluation >> needs to go back one or more steps in the path, but you could try it out. >> >> 2010/12/23 Amos Ben Israel <lucis.domi...@gmail.com> >> >> > Hello, >> > >> > I'm trying to find all paths between two nodes when relations can be of >> one >> > of two types (A or B) without repeating the same node twice - so far >> quite >> > simple. >> > the complication is that relations of type A have a property P and I want >> > only paths where P has the same value all the way (but can have two >> > different values in two different paths). >> > I tried to have a variable that is reset every time the traverse "starts >> > again from the beginning" but find it difficult to know when did this >> > happen. position.length() helps when I only have relations of type A - it >> > does not ignore relations of type B which can be on the path. >> > iterating over the path at each position works but seems inefficient - >> I'd >> > like to hear ideas for a more efficient solution. >> > >> > Amos. >> > _______________________________________________ >> > Neo4j mailing list >> > User@lists.neo4j.org >> > https://lists.neo4j.org/mailman/listinfo/user >> > >> >> >> >> -- >> Mattias Persson, [matt...@neotechnology.com] >> Hacker, Neo Technology >> www.neotechnology.com >> _______________________________________________ >> Neo4j mailing list >> User@lists.neo4j.org >> https://lists.neo4j.org/mailman/listinfo/user >> > > > > -- > David Montag > Neo Technology, www.neotechnology.com > Cell: 650.556.4411 > david.mon...@neotechnology.com > _______________________________________________ > 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