Did anyone have an opinion on what to call the methods on the Expansion
interface that specify which types to expand.

Alternative 1)
Expansion<T> and( RelationshipType type );
Expansion<T> and( RelationshipType type, Direction direction );
Expansion<T> not( RelationshipType type );

Examples:
for (Node node : startNode.expand( KNOWS )
                          .and( LIKES )
                          .and( LOVES ) ) {
   doSomethingWith(node);
}

Expansion<Relationship> expansion = startNode.expand( KNOWS );
expansion = expansion.and( LIKES );
expansion = expansion.and( LOVES );


Alternative 2)
Expansion<T> including( RelationshipType type );
Expansion<T> including( RelationshipType type, Direction direction );
Expansion<T> excluding( RelationshipType type );

Examples:
for (Node node : startNode.expand( KNOWS )
                          .including( LIKES )
                          .including( LOVES ) ) {
   doSomethingWith(node);
}

Expansion<Relationship> expansion = startNode.expand( KNOWS );
expansion = expansion.including( LIKES );
expansion = expansion.including( LOVES );


Cheers,
Tobias

On Wed, Jun 23, 2010 at 11:14 AM, Tobias Ivarsson <
tobias.ivars...@neotechnology.com> wrote:

> Hi Neo4j enthusiasts!
>
> Yesterday I committed an API that Mattias and I have been working on for a
> few days. It comes in the form of two new interfaces Expander and Expansion
> (in the org.neo4j.graphdb package), and four new methods in the Node
> interface (method names starting with "expand").
>
> The two main problems this API solves are:
> 1. Adds a clean way for getting related nodes from a source node.
> 2. Adds a type safe way for declaratively specifying any combination of
> RelationshipTypes and Directions to expand.
>
> This replaces what was actually an anti-pattern, but something we saw
> people doing a lot: using a depth-one traversal to get the nodes related to
> a node, without needing to bother with the Relationship interface. Example:
>
> // The most convenient way to write it in the past:
> Node source = ...
> Traverser traverser = source.traverse(
>     Traverser.Order.DEPTH_FIRST,
>     new StopAtDepth( 1 ),
>     ReturnableEvaluator.ALL_BUT_START_NODE,
>     TYPE_ONE, Direction.INCOMING,
>     TYPE_TWO, Direction.OUTGOING);
> for (Node related : traverser) {
>     doSomethingWith( related );
> }
>
> // The previously recommended (and bloated) way of doing it:
> Node source = ...
> for (Relationship rel : source.getRelationships( TYPE_ONE, TYPE_TWO )) {
>     Node related;
>     if (rel.isType(TYPE_ONE)) {
>         related = rel.getStartNode();
>         if (related.equals(source)) continue; // we only want INCOMING
> TYPE_ONE
>     } else if (rel.isType(TYPE_TWO)) {
>         related = rel.getEndNode();
>         if (related.equals(source)) continue; // we only want OUTGOING
> TYPE_TWO
>     } else {
>         continue; // should never happen, but makes javac know that related
> is != null
>     }
>     doSomethingWith( related );
> }
>
> // With the new API:
> Node source = ...
> for (Node related : source.expand( TYPE_ONE, Direction.INCOMING )
>                           .add( TYPE_TWO, Direction.OUTGOING ).nodes()) {
>     doSomethingWith( related );
> }
>
> The return type of the Node.expand(...)-methods are the new Expansion type,
> it defaults to expanding to Relationship, but the Expansion.nodes()-method
> makes it expand to Node. It also contains the add()-methods seen above for
> specifying RelationshipTypes to include in the expansion. The spelling of
> this method isn't perfectly decided yet, we are choosing between "add",
> "and" and "include", we want something that reads nicely in the code, but
> doesn't conflict with keywords in other JVM-languages ("and" is a keyword in
> Python, and I think "include" means something special in Ruby). There is
> also an Expansion.exlude(RelationshipType)-method for use together with the
> Node.expandAll().
>
> The Expansion is backed by the newly added companion interface Expander.
> This is an extension of RelationshipExpander that adds builder capabilities.
> It turns the functionality of the DefultExpander implementation class (now
> removed) into an interface in the API. RelationshipExpander is still around
> as a single method interface, which is useful for when you want to implement
> your own expansion logic.
>
> This API is added to trunk so that we can get feedback from everyone who
> use the snapshot builds of Neo4j, if the response to this API
> isn't positive, it will probably be removed before the release of 1.1, so
> please submit comments in this thread on what you think about this API.
>
> Happy Hacking,
> --
> Tobias Ivarsson <tobias.ivars...@neotechnology.com>
> Hacker, Neo Technology
> www.neotechnology.com
> Cellphone: +46 706 534857
>



-- 
Tobias Ivarsson <tobias.ivars...@neotechnology.com>
Hacker, Neo Technology
www.neotechnology.com
Cellphone: +46 706 534857
_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to