Great, I would much rather see this become part of the core API than have this
as part of the Enhanced API.
To make things work correctly, one important change to core is needed: The Node
interface needs to extends Traverser (the interface in
org.neo4j.graphdb.traversal, not the one in org.neo4j.graphdb).
This is actually not a big deal. There Traverser interface supports three
methods:
Iterator<path> iterator() [return 1 path with 1 element in the path, being the
node itself]Iterable<Node> nodes() [return an iterable over the node
itself]Iterable<Relationship> relationships() [return an empty iterable]
With that addition, it's not all too difficult to enhance the current
implementation of Traverser. It only adds one more iteration level over the
current implementation. Instead of having one start node, we now have multiple
start paths. When returning values from the Traverser, the start paths and the
result paths need to be concatenated.
In the new scenario, all "old" traverse() methods can remain the same, since
Node becomes a Traverser, so those methods are just special cases where
Iterable<Path> consists of 1 path, with just 1 element.
Niels
> Date: Fri, 29 Jul 2011 18:36:28 +0200
> From: [email protected]
> To: [email protected]
> Subject: Re: [Neo4j] Composable traversals
>
> There have been thoughts a long while to make something like this with the
> traversal framework, but time has never been allocated to evolve it. I'm
> adding stuff to the framework in a side track and will surely add some
> aspect of composable traversers also.
>
> 2011/7/29 Niels Hoogeveen <[email protected]>
>
> >
> > I'd like to take a stab at implementing traversals in the Enhanced API. One
> > of the things I'd like to do, is to make traversals composable.
> >
> > Right now a Traverser is created by either calling the traverse method on
> > Node, or to call the traverse(Node) method on TraversalDescription.
> >
> > This makes traversals inherently non-composable, so we can't define a
> > single traversal that returns the parents of all our friends.
> >
> > To make Traversers composable we need a function:
> >
> > Traverser traverse(Traverser, TraversalDescription)
> >
> > My take on it is to make Element (which is a superinterface of Node) into a
> > Traverser.
> >
> > Traverser is basically another name for Iterable<Path>.
> >
> > Every Node (or more generally every Element) can be seen as an
> > Iterabe<Path>, returning a single Path, which contains a single
> > path-element, the Node/Element itself.
> >
> > Composing traversals would entail the concatenation of the paths returned
> > with the paths supplied, so when we ask for the parents of all our friends,
> > the returned paths would take the form:
> >
> > Node --FRIEND--> Node --> PARENT --> Node
> >
> > Niels
> >
> > _______________________________________________
> > Neo4j mailing list
> > [email protected]
> > https://lists.neo4j.org/mailman/listinfo/user
> >
>
>
>
> --
> Mattias Persson, [[email protected]]
> Hacker, Neo Technology
> www.neotechnology.com
> _______________________________________________
> Neo4j mailing list
> [email protected]
> https://lists.neo4j.org/mailman/listinfo/user
_______________________________________________
Neo4j mailing list
[email protected]
https://lists.neo4j.org/mailman/listinfo/user