And regarding post-order, I just added post-order depth/breadth first selectors which can be used like:
TraversalFactory.createTraversalDescription().postorderDepthFirst(); or TraversalFactory.createTraversalDescription().postorderBreadthFirst(); 2010/5/18 Mattias Persson <matt...@neotechnology.com> > The easiest way to do this would be to implement your own SourceSelector > (just like DepthFirstSelector implements SourceSelector) and feed that to > your TraversalDescription, like this: > > class MyRandomSelector implements SourceSelector > { > private ExpansionSource current; > > MyRandomSelector( ExpansionSource start ) > { > this.current = start; > } > > public ExpansionSource nextPosition() > { > // Implement your random selector here > } > } > > class MyRandomSelectorFactory implements SourceSelectorFactory > { > public SourceSelector create( ExpansionSource start ) > { > return new MyRandomSelector( start ); > } > } > > Then feed it to your traversal description: > > TraversalDescription description = > TraversalFactory.createTraversalDescription().sourceSelector( > new MyRandomSelectorFactory() ); > > You can see how the depth first selector is implemented: > https://svn.neo4j.org/components/kernel/trunk/src/main/java/org/neo4j/kernel/impl/traversal/DepthFirstSelector.java > > 2010/5/17 hilmi yildirim <hilmiyildi...@gmail.com> > > Hi All, >> >> I'm new to neo4j and the mailing list. I have a simple traversal use >> case that I couldn't find a way to perform with the existing API. What >> would be your suggestion to the following scenario? >> >> I want to do a depth first traversal of the graph and want to add a >> property called "post_order_value" to each node during the traversal. >> For example, if we have a graph of >> A -> B , B -> C , A->D , D->C >> >> An example traverser labels the nodes with post-order values as C=1, >> B=2,D=3 and A=4. Because the depth first traversal first finishes C, >> then B, then D and finally A. >> >> What I am concerned is a slight variation of this problem. In the >> above example, the >> visitation order of the children is important. For example, if the >> traverser had chosen D before B while processing the children of A, >> the labels would end up being C=1, D=2,B=3 and A=4. I'd like to >> generate random traversals, so that in the DFS the traverser chooses >> the children in random order. By this way I will get many valid >> post-order labelings. >> >> Is this possible in the current traversal API or in the Improved >> framework? >> >> Thanks, >> >> >> p.s. : This email is indeed a reply to Tobias' "A new and improved >> Traversal framework" message. >> >> >> [Neo] A new and improved Traversal framework >> Tobias Ivarsson >> Tue, 30 Mar 2010 06:48:46 -0700 >> >> It seems a lot of projects have outgrown the current Traverser framework. >> People want to be able to do things such as visiting all relationships >> once >> instead of all nodes once (the current framework only visit each node once >> and leave out other relationships that go there). There has also been >> requests for a way to select the next relationship to traverse using a >> callback interface, instead of only having DEPTH_FIRST and BREADTH_FIRST >> to >> choose from. >> >> To address these requests we have started a project to implement a new >> traversal framework. The early prototype for this is available in my >> laboratory directory in the repository: >> https://svn.neo4j.org/laboratory/users/tobias/traversal/ >> The state of the prototype is very early, it supports the same features as >> the current Traverser framework plus being able to limit the traversal by >> relationships instead of nodes or based on the path to each position. This >> is already quite interesting. The part about having a callback for >> selecting >> the next relationship is a later feature, one that will probably change >> the >> API of the prototype a lot. For comparison the tests contain an >> implementation of the old Traverser framework on top of the new Traversal >> framework. The limited number of tests we've written indicate the >> performance of the old framework is still slightly better than the new >> framework, but analysis of the operations the different implementations >> make >> on the graph gives me high hopes that the new framework will probably beat >> the old one after we've worked on it some more. Even with the slightly >> lower >> performance the versatility of the new framework is substantially greater. >> >> The prototype implements a TraversalDescription class that is used to >> construct the traversal, these objects are immutable and implement a >> builder >> pattern making it possible to create base TraversalDescription instances >> that can then be reused multiple times or adapted slightly before they are >> used. This leads to shorter, more readable code than the current >> traverse(...)-methods on the Node interface. This is also the part of the >> prototype that is most likely to change, both to accomodate for the >> features >> that are to be added, and being revised to make it easier to work with. >> >> Most of the new traversal framework will live in a new >> package: org.neo4j.graphdb.traversal, but there will be a few new things >> introduced in org.neo4j.graphdb as well. The new traversal framework will >> live side by side with the current traversal framework for a while, to >> ease >> the transition. The old traversal framework will be deprecated and then >> removed in some future version. >> >> >> The additions we have made in the prototype are: >> >> * A path representation. Defined as the interface org.neo4j.graphdb.Path. >> A >> Path object represents a path of interlinking relationships. The shortest >> possible path is the path with no relationships, a single node. >> >> * A concept of Uniqueness. This defines how often a node or relationship >> can >> be (re)visited. The current traversal framework implements what we have >> called "node global uniqueness" in the new framework. This enforces the >> restriction that a node cannot be visited more than once. Other uniqueness >> kinds we introduce in the new framework are: >> * Relationship global uniqueness - similar to node global uniqueness >> * Node/Relationship path uniqueness - each node (or relationship) may >> occur only once in the path (yes, using the Path interface from above) >> traversed to get there. >> * Node/Relationship recent uniqueness - a node (or relationship) may not >> be revisited if it is among the set of recently visited ones (the size of >> this set is configurable). This is similar to global uniqueness, but with >> a >> constraint on the amount of memory the traversal is allowed to use. >> * No uniqueness. The name says it all, all nodes and relationships are >> visited, without restriction. >> >> * PruneEvaluator - has the same role as the previous StopEvaluator, but >> with >> a more descriptive name. >> >> * RelationshipExpander - this is "what traversers are made of", given a >> node, a RelationshipExpander is responsible for getting the relationships >> from it that are relevant to the traversal. This is a utility that is used >> a >> lot in the new traversal framework, and that might also be useful on its >> own. >> >> >> The concepts we are planning to add, but have not completed the design for >> yet are: >> >> * A way to select/order relationships. This is an extension of DEPTH_FIRST >> and BREADTH_FIRST, where the user can define which relationships to >> traverse, and in what order to traverse them. >> >> * Relationship patterns, a way to tell the traversal to expand one >> relationship type first, and then another type, and so on. >> >> >> Try it out and give us feedback, we will keep working on the >> implementation, >> and hope to push this into the trunk of kernel as soon as possible. >> >> -- >> Tobias Ivarsson <tobias.ivars...@neotechnology.com> >> Hacker, Neo Technology >> www.neotechnology.com >> Cellphone: +46 706 534857 >> _______________________________________________ >> Neo mailing list >> User@lists.neo4j.org >> https://lists.neo4j.org/mailman/listinfo/user >> _______________________________________________ >> Neo mailing list >> User@lists.neo4j.org >> https://lists.neo4j.org/mailman/listinfo/user >> > > > > -- > Mattias Persson, [matt...@neotechnology.com] > > Hacker, Neo Technology > www.neotechnology.com > -- Mattias Persson, [matt...@neotechnology.com] Hacker, Neo Technology www.neotechnology.com _______________________________________________ Neo mailing list User@lists.neo4j.org https://lists.neo4j.org/mailman/listinfo/user