I see I made a bit of a mistake with this one. The gist of the solution 
remains, but I made a mistake dealing with the directions of relationship.
It should be something like this.
public boolean areConnected(Node n1,Node n2, RelationshipType relType,Direction 
dir) {
 
 Direction dir2 = null;
 if(dir.equals(Direction.INCOMING))
   dir2 = Direction.OUTGOING;
 else if(dir.equals(Direction.OUTGOING))
   dir2 = Direction.INCOMING;
 else dir2 = Direction.BOTH;

 Iterator<Relationship> rels1 = n1.getRelationships(relType, dir).iterator();
 Iterator<Relationship> rels2 = n2.getRelationships(relType, dir2).iterator();
 
 while(rels1.hasNext && rels2.hasNext){
   Relationship rel1 = rels1.next();
   Relationship rel2 = rels2.next();
 
   if (rel1.getEndNode().equals(n2)
     return true;
   else if (rel2.getEndNode().equals(n1))
     return true;
 }
 return false;
}
> From: pd_aficion...@hotmail.com
> To: user@lists.neo4j.org
> Date: Thu, 27 Oct 2011 19:05:16 +0200
> Subject: Re: [Neo4j] Function to check whether two nodes are connected?
> 
> 
> There is one caveat to this method, you'd have to know which node is most 
> densely connected. 
> 
> Suppose one of the nodes has 100,000 relationships (incoming and outgoing) 
> and the other node has only a few relationships, then you'd want to iterate 
> over the relationships of the second node.
> 
> A solution could be to iterate over both sets of relationships at the same 
> time:
> 
> public boolean areConnected(Node n1,Node n2, RelationshipType 
> relType,Direction dir) {
> 
>   Iterator<Relatiionship> rels1 = n1.getRelationships(relType, 
> dir).iterator();
>   Iterator<Relatiionship> rels2 = n2.getRelationships(relType, 
> dir).iterator();
> 
>   while(rels1.hasNext && rels2.hasNext){
>      Relationship rel1 = rels1.next();
>      Relationship rel2 = rels2.next();
> 
>     if (rel1.getEndNode().equals(n2)
>       return true;
>     else if (rel2.getEndNode().equals(n1))
>       return true;
>   }
>   return false;
> }
> > Date: Thu, 27 Oct 2011 18:39:01 +0200
> > From: bplsi...@gmail.com
> > To: user@lists.neo4j.org
> > Subject: Re: [Neo4j] Function to check whether two nodes are connected?
> > 
> > Easy: just one.
> > 
> > For now, I've written this, but I'm still not sure it is the simplest 
> > way to write it
> > 
> >      public boolean areConnected(Node n1,Node n2,Relationship 
> > rel,Direction dir) throws Exception {
> >          Iterable<Relationship> relationships = n1.getRelationships(dir);
> > 
> >          for (Relationship r : relationships) {
> >              //I am only working with Dynamic Relationships
> >              if (r.getType().equals(rel.getType())) {
> >                  if (dir == Direction.OUTGOING) { if 
> > (r.getEndNode().equals(n2)) { return true; } }
> >                  else { if (r.getStartNode().equals(n2)) { return true; } }
> >              }
> >          }
> >          return false;
> >      }
> > 
> > Bruno
> > 
> > Le 27/10/2011 18:31, Peter Neubauer a écrit :
> > > Bruno,
> > > There is no such function low level, but toy can use a Shortest path algo 
> > > to
> > > check this. What is the maximum length for a path between the nodes?
> > > On Oct 27, 2011 6:14 PM, "Bruno Paiva Lima da Silva"<bplsi...@gmail.com>
> > > wrote:
> > >
> > >> Hello there!
> > >> First of all, thanks for the help in all my previous questions, all the
> > >> answers have been helping me to use Neo4j with success.
> > >>
> > >> I have a very simple question, but I haven't found the answer yet...
> > >>
> > >> I'd like to have a function, which signature would be more or less like
> > >> this:
> > >>
> > >> public areTheyConnected(Node *n1*,Node *n2*,Relationship *rel*,Direction
> > >> *dir*)
> > >>
> > >> which returns true iff there is an edge of type *rel*, between *n1* and
> > >> *n2*, in the *dir* direction (the direction has n1 as reference).
> > >>
> > >> Example:
> > >>
> > >> In my graph, I have: "Bob knows Tom, Tom knows Peter, Jack knows Tom"
> > >>
> > >> areTheyConnected(nodeBob,nodeTom,relKnows,Direction.OUTGOING) returns
> > >> true; (Bob knows Tom)
> > >> areTheyConnected(nodeTom,nodeJack,relKnows,Direction.INCOMING) also
> > >> returns true; (Jack knows Tom)
> > >>
> > >> areTheyConnected(nodeBob,nodeTom,relKnows,Direction.INCOMING) returns
> > >> false; (Tom doesn't know Bob)
> > >>
> > >> Is there an easy method (constant time, or close) for that?
> > >>
> > >> Thank you very much,
> > >> Bruno
> > >> _______________________________________________
> > >> 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