我正在使用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。由于鲍勃不在名单上,所以他不应该匹配。
我该怎么做?
答案 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。