2017-03-16 18 views
0

我是Neo4j和Cypher的新手。我有一张与友谊相关的人的大图,我想从1人开始,但是从另一个州的朋友那里得到所有的路径。我需要展示来自其他州的第一位朋友,但没有他/她的朋友。基本上,我希望路径结束,当它发现一个相关的朋友不是来自指定状态的节点。 任何帮助将不胜感激。Cypher查询在特定条件后停止

Jack {st:'MI'}<-[Friend]-Jill {st:'MI'}<-[Friend]-John {st:'OH'}<-[Friend]-Tim {st:'OH'} 

查询应该只返回杰克,吉尔和约翰。不是蒂姆。

编辑/添加

John <-[Friend]-Joan {st:'MI'} 

琼也应该不会在查询返回。

谢谢!

回答

0

这样的事情呢。匹配处于相同状态的所有朋友,然后结束该路径,并匹配来自不同状态的结尾旁边的所有朋友。

MATCH path=(start:Person {name: 'Jack'})<-[:FRIEND*]-(end:Person) 
WHERE end.st = start.st 
AND all(p in nodes(path) where p.st = start.st) 
WITH path, end 
RETURN nodes(path), [(end)<-[:FRIEND]-(other:Person) WHERE other.st <> end.st | other] as other_state 

这个查询只能返回那里有other_state节点的行。

MATCH path=(start:Person {name: 'Joe'})<-[:FRIEND*..10]-(end:Person) 
WHERE end.st = start.st 
AND all(p in nodes(path) where p.st = start.st) 
WITH nodes(path) as same_state, [(end)<-[:FRIEND]-(other:Person) WHERE other.st <> end.st | other] as other_state 
WHERE size(other_state) > 0 
RETURN same_state, other_state 

更改,以便将容纳约翰,琼和Tim使用情况

MATCH path=(start:Person {name: 'John'})-[:FRIEND*0..]-(end:Person) 
WHERE end.st = start.st 
AND all(p in nodes(path) where p.st = start.st) 
WITH nodes(path) as same_state, [(end)-[:FRIEND]-(other:Person) WHERE other.st <> end.st | other] as other_state 
WHERE size(other_state) > 0 
RETURN same_state, other_state 
+0

这样的作品,但有一个转折。如果琼是MI的John's的朋友 - 她也不应该表演。我会更新数据集更清晰。对不起,我错过了。 – Mark

+0

第二个查询适用于Jack,但如果我从John开始,我想让Joan和Tim回来。它不会为约翰返回任何东西。这可能比我想象的更难。 – Mark

+0

添加了新的查询。必须改变一些事情。为仅包含单个节点的路径增加了容量,并取消了关系中的定向性。 –