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