cypher / Neo4j中朋友之间的联系

时间:2014-09-17 12:52:40

标签: neo4j cypher

我有一个图表,我试图查询,基本上人们可以联系其他人。

我希望运行一个cypher查询,该查询以一个人开头并返回他们所联系的所有人以及他们的联系人之间的任何联系。

这是我用

开头的查询
start n = node:node_auto_index(name = "TOM") MATCH (n)-[r]-(m) RETURN *

在neo4j网络界面中,这将返回Tom,任何与汤姆联系的人以及汤姆联系人之间在所有20个节点和32个关系中的任何关系。结果以m,n r(节点,节点,关系)格式输出

然而,当我跑

start n = node:node_auto_index(name = "TOM") MATCH (n)-[r]-(m) RETURN count(*)

它说汤姆的联系人之间只有26个关系并且不包括任何关系。

我将结果拉入d3.js可视化,理想情况下,结果仍然会以类似于节点,节点,关系的格式输出(即一行上的每个相关对)。

编辑:更多细节

我有一个图表,用户可以互相联系。我希望能够查询用户并找回他所联系的所有用户以及他联系的用户之间的任何联系。与LinkedinLabs Inmaps相似

enter image description here

但我需要输出格式,我可以在d3 forced directed中相对直接使用。

例如,如果输出有,例如<​​/ p>

 (Tom) - (Tom's friend) - (Tom's Friend's Friend)

将其分解为

会容易得多
 (Tom) - (Tom's friend)
 (Tom's Friend) - (Tom's Friend's Friend)

由于这个d3图表需要并输入Nodes对象和Links对象。


修改

来自uklas&#39;回答,这让它发挥作用。

start n = node:node_auto_index(name = "Tom")
MATCH (n)-[r]-(m)
RETURN n as person, m as personas_fr, r
UNION
start n = node:node_auto_index(name = "Tom")
MATCH (a)-[r1]-(n)-[r2]-(m), (a)-[r]-(m)
RETURN a as person, m as personas_fr, r

1 个答案:

答案 0 :(得分:1)

可能存在多个联系人关系,即Tom多次联系了一些人。使用count(*)您正在汇总此类联系人,这些联系人只返回与其联系的唯一身份用户。仅使用*,您将返回匹配的所有内容。

如果你想写更多关于你的目标,以及你想做什么(即提出问题),我还可以添加一些关于如何继续的建议。

<强>更新

不幸的是我不熟悉d3格式,但也许这会有所帮助:

    start n = node:node_auto_index(name = "TOM")
    MATCH (n)-[r]-(m)
    RETURN n as person, m as personas_fr
    UNION 
    start n = node:node_auto_index(name = "TOM")
    MATCH (n)-[r]-(m), (m)-[r2]-(m2)
    WHERE Id(n) <> Id(m2)
    RETURN m as person, l as personas_fr

以格式

返回数据
 (Tom) - (Tom's friend1)
 (Tom) - (Tom's friend2)
 (Tom) - (Tom's friend3)
 (Tom's Friend1) - (Tom's Friend's Friend)
 (Tom's Friend1) - (Tom's Friend's Friend)
 (Tom's Friend1) - (Tom's Friend's Friend)
 (Tom's Friend2) - (Tom's Friend's Friend)
 (Tom's Friend2) - (Tom's Friend's Friend)
 (Tom's Friend3) - (Tom's Friend's Friend)
 (Tom's Friend3) - (Tom's Friend's Friend)