Hi!

See:
http://www.mail-archive.com/user@lists.neo4j.org/msg04044.html

/anders

On 06/23/2010 03:44 PM, Alex Averbuch wrote:
> Hi Tobias,
> It seems as though the new changes have broken the AStar code I'm using.
>
> I use:
> neo4j-apoc 1.1-SNAPSHOT
> neo4j-graph-algo 0.5-SNAPSHOT
>
> AStar uses DefaultExpander and can no longer find it.
>
> Here's an example of the code that worked until now.
>
> DefaultExpander relExpander = new DefaultExpander();
> relExpander.add(GISRelationshipTypes.BICYCLE_WAY, Direction.BOTH);
> AStar sp = new AStar(graphDb, relExpander, costEval, estimateEval);
> Path path = sp.findSinglePath(startNode, endNode);
>
> The problem seems to be that AStar wants a RelationshipExpander but now I
> can only create an Expansion<Relationship>.
>
> Do you have any suggestions as to how to make this work again?
>
> Regards,
> Alex
>
>
> 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
>> _______________________________________________
>> 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
_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to