Hi Peter,

I know it's completely cheeky, but I'd love python versions of example code if 
possible... Even if it points at which bit of REST api I'd need to implement...

thanks

Tom




On 14 Feb 2011, at 23:17, Peter Neubauer wrote:

> Hi John,
> see the following example on something that should roughly work as you
> want. Notice that I only check for the existence of "relProp" on REL3,
> you can of course check for a value, but I didn't have a good example.
> 
> This gives you the paths:
> 
> (1)--[REL1,3]-->(2)--[REL2,4]-->(3)--[REL3,5]-->(4)--[REL4,6]-->(5)
> (1)--[REL1,7]-->(6)--[REL3,8]-->(7)--[REL4,10]-->(8)--[REL2,12]-->(9)
> 
> Which is what you want - paths of length exactly 4, with unordered
> REL1, REL2, REL3, REL4 and a constraint on REL3?
> 
> /peter
> 
> 
> package org.neo4j.examples.orderedpath;
> 
> import static org.neo4j.graphdb.DynamicRelationshipType.withName;
> 
> import java.util.ArrayList;
> 
> import org.junit.BeforeClass;
> import org.junit.Test;
> import org.neo4j.graphdb.Direction;
> import org.neo4j.graphdb.Node;
> import org.neo4j.graphdb.Path;
> import org.neo4j.graphdb.Relationship;
> import org.neo4j.graphdb.RelationshipType;
> import org.neo4j.graphdb.Transaction;
> import org.neo4j.graphdb.traversal.Evaluation;
> import org.neo4j.graphdb.traversal.Evaluator;
> import org.neo4j.graphdb.traversal.TraversalDescription;
> import org.neo4j.graphdb.traversal.Traverser;
> import org.neo4j.kernel.EmbeddedGraphDatabase;
> import org.neo4j.kernel.Traversal;
> 
> public class NonOrderedPathTest
> {
>    private static EmbeddedGraphDatabase db;
>    private static RelationshipType REL1 = withName( "REL1" ),
>            REL2 = withName( "REL2" ), REL3 = withName( "REL3" ),
>            REL4 = withName( "REL4" ), REL8 = withName( "REL8" ),
>            REL9 = withName( "REL9" ), REL10 = withName( "REL10" );
> 
>    @BeforeClass
>    public static void createTheGraph()
>    {
>        db = new EmbeddedGraphDatabase( "target/db" );
>        Transaction tx = db.beginTx();
>        // START SNIPPET: createGraph
>        Node A = db.createNode();
>        Node B = db.createNode();
>        Node C = db.createNode();
>        Node D = db.createNode();
>        Node E = db.createNode();
>        Node P = db.createNode();
>        Node Q = db.createNode();
>        Node R = db.createNode();
>        Node S = db.createNode();
>        Node T = db.createNode();
>        Node U = db.createNode();
>        Node X = db.createNode();
>        Node Y = db.createNode();
>        Node Z = db.createNode();
>        A.createRelationshipTo( X, REL1 );
>        X.createRelationshipTo( Y, REL2 );
>        Y.createRelationshipTo( Z, REL8 );
>        A.createRelationshipTo( B, REL1 );
>        B.createRelationshipTo( C, REL2 );
>        Relationship rel3 = C.createRelationshipTo( D, REL3 );
>        rel3.setProperty( "relProp", 123 );
>        D.createRelationshipTo( E, REL4 );
>        A.createRelationshipTo( P, REL1 );
>        Relationship rel33 = P.createRelationshipTo( Q, REL3 );
>        rel33.setProperty( "relProp", 123 );
>        Q.createRelationshipTo( R, REL9 );
>        Q.createRelationshipTo( R, REL4 );
>        R.createRelationshipTo( E, REL10 );
>        R.createRelationshipTo( S, REL2 );
>        S.createRelationshipTo( T, REL9 );
>        T.createRelationshipTo( U, REL8 );
> 
>        tx.success();
>        tx.finish();
>    }
> 
>    @Test
>    public void testPath()
>    {
>        TraversalDescription td = Traversal.description().expand(
>                Traversal.expanderForTypes( REL1, Direction.OUTGOING, REL2,
>                        Direction.OUTGOING, REL3, Direction.OUTGOING, REL4,
>                        Direction.OUTGOING ) ).evaluator( new Evaluator()
>        {
> 
>            public Evaluation evaluate( Path path )
>            {
>                if ( path.length() == 0 )
>                {
>                    return Evaluation.EXCLUDE_AND_CONTINUE;
>                }
>                ArrayList<String> relTypes = new ArrayList<String>();
>                for(Relationship rel : path.relationships()) {
>                    String relname = rel.getType().name();
>                    if(relname.equals( REL3.name() )) {
>                        if(rel.hasProperty( "relProp" )) {
>                        } else {
>                            return Evaluation.EXCLUDE_AND_PRUNE;
>                        }
>                    }
>                    if(!relTypes.contains( relname )) {
>                        relTypes.add( relname );
>                    } else {
>                        return Evaluation.EXCLUDE_AND_PRUNE;
>                    }
>                }
>                return
> path.length()==4?Evaluation.INCLUDE_AND_CONTINUE:Evaluation.EXCLUDE_AND_CONTINUE;
>            }
>        } );
>        Traverser t = td.traverse( db.getNodeById( 1 ) );
>        for ( Path path : t )
>        {
>            System.out.println( path );
>        }
> 
>    }
> }
> 
> 
> Cheers,
> 
> /peter neubauer
> 
> GTalk:      neubauer.peter
> Skype       peter.neubauer
> Phone       +46 704 106975
> LinkedIn   http://www.linkedin.com/in/neubauer
> Twitter      http://twitter.com/peterneubauer
> 
> http://www.neo4j.org               - Your high performance graph database.
> http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party.
> 
> 
> 
> On Mon, Feb 14, 2011 at 6:34 PM, John Howard <johnyho...@gmail.com> wrote:
>> Thanks Peter & Craig.
>> 
>> There are no such constraints, that is, relationship types can reoccur if a
>> path satisfies the input criteria.
>> For ex: If there was another path in our graph example, say,
>>       REL1        REL3         REL4       REL2      REL9       REL8
>>  A ---------> P ---------> Q -----------> R ---------> S
>> ---------->T----------->U
>> 
>> we would like to see 2 paths, viz,  A ->B->C->D-> E and  A ->P->Q->R-> S
>> 
>> I tried with the map suggestion, the prune logic doesn't seem to fit with
>> the existing evaluators.
>> Again, my understanding of the prune evaluators may be wrong.
>> Appreciate your help.
>> 
>> Thank you.
>> 
>> 
>> On Mon, Feb 14, 2011 at 5:22 AM, Peter Neubauer <
>> peter.neuba...@neotechnology.com> wrote:
>> 
>>> John,
>>> In your example, are there any constraints on that of the four
>>> relationship types, every one need to be exactly one time in the path,
>>> or is it just any of these?
>>> 
>>> Instead of using a List like in the previous example, you can the use
>>> a Map to tick the visited relationship types and check the property
>>> when you get to REL3? I can do it for you in neo4j-examples again if
>>> you give me some more details :)
>>> 
>>> Cheers,
>>> 
>>> /peter neubauer
>>> 
>>> GTalk:      neubauer.peter
>>> Skype       peter.neubauer
>>> Phone       +46 704 106975 <+46704106975>
>>> LinkedIn   http://www.linkedin.com/in/neubauer
>>> Twitter      http://twitter.com/peterneubauer
>>> 
>>> http://www.neo4j.org               - Your high performance graph database.
>>> http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party.
>>> 
>>> 
>>> 
>>>  On Sun, Feb 13, 2011 at 10:16 AM, John Howard <johnyho...@gmail.com>
>>> wrote:
>>>> Thanks Peter. That was very useful.
>>>> 
>>>> I am trying to get the path A ->B->C->D-> E in the below graph, with the
>>>> following inputs
>>>> Start Node: A,
>>>> Relationships: REL1, REL4, REL2 (that is, order is not known)
>>>> Relationship Property: relProp= "abc" in REL3
>>>> 
>>>> I was not able to define an evaluator which takes the combination of
>>>> relationship types(without regard to order) and relationship properties
>>> to
>>>> return the desired path.
>>>> Can it be achievable in the current traversal framework?
>>>> 
>>>>      REL1          REL2        REL8
>>>>  A ---------> X ---------> Y -----------> Z
>>>> 
>>>>       REL1        REL2         REL3        REL4
>>>>  A ---------> B ---------> C -----------> D ---------> E
>>>> 
>>>>       REL1        REL3         REL9       REL10
>>>>  A ---------> P ---------> Q -----------> R ---------> E
>>>> 
>>>> 
>>>> As always, appreciate your guidance.
>>>> 
>>>> 
>>>> 
>>>> =======================================================
>>>> John,
>>>> if the order of the relationships doesn't matter, you could do
>>>> something like this with the Traversal API (holding an ordered Path to
>>>> test against in your Evaluator):
>>>> 
>>>>    public void testPath()
>>>>    {
>>>>        final ArrayList<RelationshipType> orderedPath = new
>>>> ArrayList<RelationshipType>();
>>>>        orderedPath.add( withName( "REL1" ) );
>>>>        orderedPath.add( withName( "REL2" ) );
>>>>        orderedPath.add( withName( "REL3" ) );
>>>>        orderedPath.add( withName( "REL4" ) );
>>>> 
>>>>        TraversalDescription td = Traversal.description().evaluator(
>>>>                new Evaluator()
>>>>                {
>>>> 
>>>>                    public Evaluation evaluate( Path path )
>>>>                    {
>>>>                        if ( path.length() == 0 )
>>>>                        {
>>>>                            return Evaluation.EXCLUDE_AND_CONTINUE;
>>>>                        }
>>>>                        String  currentName=
>>>> path.lastRelationship().getType().name();
>>>>                        String relationshipType = orderedPath.get(
>>>> path.length() - 1 ).name();
>>>>                        if ( path.length() == orderedPath.size() )
>>>>                        {
>>>>                            if ( currentName.equals(
>>>>                                    relationshipType ) )
>>>>                            {
>>>>                                return Evaluation.INCLUDE_AND_PRUNE;
>>>>                            }
>>>>                            else
>>>>                            {
>>>>                                return Evaluation.EXCLUDE_AND_PRUNE;
>>>>                            }
>>>>                        }
>>>>                        else
>>>>                        {
>>>>                            if ( currentName.equals(
>>>>                                    relationshipType ) )
>>>>                            {
>>>>                                return Evaluation.EXCLUDE_AND_CONTINUE;
>>>>                            }
>>>>                            else
>>>>                            {
>>>>                                return Evaluation.EXCLUDE_AND_PRUNE;
>>>>                            }
>>>>                        }
>>>>                    }
>>>>                } );
>>>>        Traverser t = td.traverse( getNodeWithName( "A" ) );
>>>>        for ( Path path : t )
>>>>        {
>>>>            System.out.println(path);
>>>>        }
>>>> 
>>>>    }
>>>> 
>>>> I am attaching the classes for your reference, so you have full code.
>>>> 
>>>> Also, you could try JRuby, Gremlin or other along the same lines. But
>>>> this is a basic Java example in creating an ordered Path information
>>>> and checking against it during the traversal. You can add in more
>>>> stuff of course ...
>>>> 
>>>> Cheers,
>>>> 
>>>> /peter neubauer
>>>> 
>>>> GTalk:      neubauer.peter
>>>> Skype       peter.neubauer
>>>> Phone       +46 704 106975 <+46704106975>
>>>> LinkedIn   http://www.linkedin.com/in/neubauer
>>>> Twitter      http://twitter.com/peterneubauer
>>>> 
>>>> http://www.neo4j.org               - Your high performance graph
>>> database.
>>>> http://www.thoughtmade.com - Scandinavia's coolest Bring-a-Thing party.
>>>> 
>>>> 
>>>> 
>>>> On Tue, Jan 25, 2011 at 10:59 PM, John Howard <johnyhowdy at gmail.com>
>>>> wrote:
>>>>> Hello,
>>>>> 
>>>>> We are trying to use neo4j graph database in one of our applications.
>>>>> I think we hit a roadblock with traversal framework. It could be due to
>>>> our
>>>>> limited knowledge of neo4j framework.
>>>>> 
>>>>> Here is what we are trying to accomplish:
>>>>> We need to get a path(from the graph below) from the nodes A to E
>>> through
>>>>> relations REL1, REL2, REL3 & REL4.
>>>>> All we know before the traversal is: Node A, REL1, REL2, REL3,
>>>>> REL4..(sometime we even know the end node E)
>>>>> So how can we get the path A to E? I can't seem to achieve it using
>>>>> evaluator and/or relationships in TraversalDescription. It always
>>> returns
>>>> me
>>>>> nodes X, P,Q since they have one my relationships(REL1, REL3).
>>>>> 
>>>>> 
>>>>>      REL1        REL2        REL8
>>>>>  A ---------> X ---------> Y -----------> Z
>>>>> 
>>>>>       REL1      REL2        REL3        REL4
>>>>>  A ---------> B ---------> C -----------> D ---------> E
>>>>> 
>>>>>       REL1       REL3         REL9       REL10
>>>>>  A ---------> P ---------> Q -----------> R ---------> E
>>>>> 
>>>>> 
>>>>> Nodes: A, B, C, D,E,X,Y,Z,P,Q,R,
>>>>> Relations: REL1....REL10
>>>>> 
>>>>> 
>>>>> Thank you for your help.
>>>>> 
>>>>> John
>>>>> _______________________________________________
>>>>> Neo4j mailing list
>>>>> User at lists.neo4j.org
>>>>> https://lists.neo4j.org/mailman/listinfo/user
>>>>> 
>>>> -------------- next part --------------
>>>> A non-text attachment was scrubbed...
>>>> Name: gist.zip
>>>> Type: application/zip
>>>> Size: 5718 bytes
>>>> Desc: not available
>>>> Url :
>>>> 
>>> http://lists.neo4j.org/pipermail/user/attachments/20110126/f2e3cac5/attachment-0001.zip
>>>> _______________________________________________
>>>> 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
>> 
> _______________________________________________
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user

------------------------------------------------------------------------
Tom Smith:  Collaborative Software Specialist
VC/ 011, Vanbrugh Building, University of York, YO10 5DD
mob: 07720 288285     tel:  01904 32 3847
http://collaborate.york.ac.uk
http://www.york.ac.uk/it-services/groups/collab/
http://bit.ly/toms-calendar
------------------------------------------------------------------------











_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to