Given these additions to the API, the problem in this thread would be solved
something like this:
http://wiki.neo4j.org/content/Traversal_HowTo#Label_all_nodes_in_a_depth_first_traversal_by_postorder

btw, I intend to start adding more traversal howtos to that page, I
encourage everyone to do the same :)

Cheers,
Tobias

On Tue, May 18, 2010 at 10:19 AM, Mattias Persson <matt...@neotechnology.com
> wrote:

> 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
>



-- 
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

Reply via email to