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

Reply via email to