Then,
you would like to get all the paths that containing any number of
single occurrences of REL1...REL4?

In that case, I would from the current end of the path, look one
relationship further (path.endNode().getRelationships()), and
EXCLUDE_CONTINUE include the path if the at least one of the next
relationships will fit your criteria (e.g. you can go one hop
further). If not, return INCLUDE_PRUNE, meaning that this path is
already the longest you can go with the constraints.

Does that make sense?



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 Thu, Feb 17, 2011 at 12:15 AM, John Howard <johnyho...@gmail.com> wrote:
> Thanks Peter. Really appreciate your help.
>
> Yes, in somecases the path is exactly 4.
> But in others, it may not be. I am wondering what would be the prune
> criterion if the path is not exactly 4.
> Say,
>
>   REL1        REL2       REL3
> A ---------> P ---------> Q -----------> T
>
> And I would like to get A->P->Q->T returned as a path along the with
> previous 2 paths.
>
>
> On Mon, Feb 14, 2011 at 6:17 PM, Peter Neubauer <
> peter.neuba...@neotechnology.com> 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
>>
> _______________________________________________
> 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