Mmh,
I am not fluent in Python, so I would leave that to the experts. I
think Tobias is going to crunch on the Python bindings VERY soon, so I
guess there will be a good stream of awesomeness coming out from
there. Watch the space in the coming weeks, or maybe there are others
stepping up?

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 Tue, Feb 15, 2011 at 10:54 AM, Tom Smith <tom.sm...@york.ac.uk> wrote:
> 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
>
_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to