2017-05-31 97 views
-2

在使用Cypher的Ne​​o4j中:Neo4j - 只有共同朋友的人

我需要找到PersonB与PersonA完全相同的朋友。

例子: 保罗知道彼得,安娜和迈克和其他人。 找到还有谁知道彼得,安娜和迈克以及其他人。

在此先感谢。

+5

Stackoverflow不是代码编写服务。请输入一些输入数据,预期输出和您尝试解决问题的方法。 –

+0

@Fabio Lamanna,如果你没有给谈话带来任何有用的东西,你能不干涉吗?我的问题中列出了你的三个“请求”中的两个。 Stackoverflow帮助人们获得帮助,我很高兴Tezra帮助了我。 – pl80

+0

我根本没有干涉,只是帮助你遵循[Stackoverflow指导方针](https://stackoverflow.com/help/on-topic)你应该问之前阅读。我很高兴有人做出了自己的努力,并为你解决问题。 –

回答

1

这里是如何做到这样的查询故障。

// Match side a 
MATCH (n1:Person)--(m:Person) 
WITH n1, COLLECT(m) as friends 
// Match side b 
MATCH (n2:Person)--(m:Person) 
WITH n1, n2, friends as friends1, COLLECT(m) as friends2 
// Filter out a-b same node or non identical friends lists. 
WHERE n1<>n2 AND SIZE(friends1) = SIZE (friends2) AND ALL (f in friends1 WHERE f in friends2) 
RETURN n1, n2 
+0

谢谢你,这工作得很好。我相信你可以通过取出“AND SIZE(friends1)= SIZE(friends2)”并添加“AND ALL(朋友2在朋友1的哪里f)中”来获得相同的结果。 n1拥有n2和n2的所有朋友都拥有n1的所有朋友。 – pl80

+1

@ pl80你想要SIZE检查。它过滤掉friends1是friends2的子集,如果SIZE检查失败,Cypher可以跳过比较列表,这将为您节省大量dbhits。 – Tezra

+0

好点。我遇到的另一个问题是,当我没有指定n1是谁时,数据库将耗尽内存,因为我有30k关系,所以30k square = 900M对我的机器来说太大了。一旦我将n1缩小到一个人,查询就可以快速工作:) – pl80