Cypher Match节点与列表中没有的任何节点无关

时间:2017-10-19 14:50:50

标签: neo4j cypher

我正在使用Cypher查询,我有一个列表,让我们说人(['Peter', 'Stacy', 'Olli'])。 我正在寻找所有人,其中有3人是他们唯一的朋友。 所以基本上我正在尝试match (p:Person)-[:HAS_FRIEND]->(q:Person) WHERE q.name in ['Peter', 'Stacy', 'Olli'],但我想排除那些不在列表中的朋友。

例如,Bobs的朋友是Peter和Stacy。这意味着他应该匹配。 Jans的朋友是Stacy,Olli和Bob。由于鲍勃不在名单上,所以他不应该匹配。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用ALL功能执行此操作:

MATCH (p:Person)-[:HAS_FRIEND]->(q:Person)
WITH p, collect(q) as friends
WHERE ALL(friend in friends WHERE friend.name IN ['Peter', 'Stacy', 'Olli'])
RETURN p

此Cypher查询将返回所有朋友都在朋友列表中的:Person个节点。

答案 1 :(得分:1)

一种稍微复杂一些的方法应该排除:朋友多于与他们相匹配的朋友。

RoundImageView
在这种情况下,

class RoundImageView: UIImageView { override func layoutSubviews() { super.layoutSubviews() layer.masksToBounds = true layer.cornerRadius = frame.width / 2 } } 具有$ friendNames集合参数的最大大小。他们的朋友至少和MATCH (p:Person)-[:HAS_FRIEND]->(friend:Person) WHERE friend.name in $friendNames WITH p, count(p) as friendHits WHERE size((p)-[:HAS_FRIEND]->()) = friendHits RETURN p 一样多。如果他们有更多,那么他们有除输入集合中指定的朋友以外的朋友,并被过滤掉。

这里的优点是我们开始扩展:与输入集合中的朋友关联的Person节点,而不是必须扫描所有:人员及其在db中的朋友,所以你要查询一个小得多的部分db。