【问题标题】:Connections between friends in cypher / Neo4jcypher / Neo4j中朋友之间的联系
【发布时间】:2014-09-17 12:52:39
【问题描述】:

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

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

这是我开始的查询

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

在 neo4j Web 界面中,这将返回 Tom、任何与 tom 联系的人以及 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

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

例如,如果输出有,例如

 (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 的回答,这可以正常工作。

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案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)
    

    【讨论】:

    • 我添加了更多细节。
    • 谢谢你,我以前从没想过Union。不幸的是,m2 似乎包含了所有 m 的朋友(所以 tom 的朋友的朋友......),但我只想包括朋友的朋友,他们也是 tom 的另一个朋友的朋友(所以有不同的 m 的朋友)...... . 所以该图应该只包含汤姆和他的朋友,还包括他的朋友之间的关系。
    • 我对您的代码进行了一些小改动,我将它添加到原始帖子中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多