【问题标题】:Find path between nodes through cypher通过密码查找节点之间的路径
【发布时间】:2014-01-09 09:13:16
【问题描述】:

我创建了一个应用程序,用电子邮件记录填充 Neo4J 数据库。我创建了 2 种类型的节点,person 和 mail,我创建了 4 种类型的关系,send、cc、to 和 reply_of。

现在我想找到两个没有直接连接的节点之间的关系。例如在 P1 和 P3 之间(见图)。

如何通过 cypher 实现这一目标?在 neo4j 中是否可行?

更新问题:

首先让我澄清一下关于图片的一些事情......

Reply_OF 关系是邮件节点之间的关系。它在原始邮件和转发邮件的任何回复之间建立关系。 Sent、To、Cc 和 Bcc 关系创建人员节点和邮件节点之间的关系。人物节点之间没有直接关系。

提交这个问题并阅读答案让我意识到我想知道其他事情......我真正想知道的是如何显示所有已看到回复或从原始邮件转发邮件的人员节点不在原始邮件的收件人、抄送或密送列表中。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    在 Neo4j 术语中,您希望找到 P1 和 P3 之间的路径。一段关系只连接两个邻居。

    我假设P 节点带有Person 标签,并且具有name 属性,在这种情况下您可以使用:

    MATCH p=(p1:Person {name:'P1'})-[:SENT|:TO|:CC|:BCC*1..20]->(p3:Person {name:'P3'})
    RETURN p
    

    在很多情况下,您对它们之间的最短路径感兴趣:

    MATCH p=shortestPath((p1:Person {name:'P1'})-[:SENT|:TO|:CC|:BCC*1..20]->(p3:Person {name:'P3'})
    RETURN p
    

    【讨论】:

    • 关系应该是无方向的,否则,是的,这将起作用。
    • @Stefan 谢谢你的回答。这不是我追求的最短路径,我想找到两个或多个节点之间的所有通信。
    • @Josh 在这种情况下你所说的无方向是什么意思?
    • 答案中的 Cypher 查询显示了带有 -[]-> 箭头的关系,但您的图表显示了两个方向的人之间的联系(如 Reply_Of 类型)。从查询中删除“>”字符以获取这些路径。
    • 取决于查询的语义:如果您想要 P1 和 P3 之间的所有通信,那么您是对的。如果您希望通信从 P1 流向 P3,则需要定向关系。
    【解决方案2】:

    回答更新的问题:

    我假设您的电子邮件节点带有 Email 的标签并具有 mailId 的属性。

    MATCH (mailToTrack:Email {mailId: 'mymailid'})-[:Reply_Of*1..100]->()-[:TO|:CC|:BCC]->(person)
    RETURN distinct person
    

    【讨论】:

    • 我在MATCH a=(first:IfcNode {nid: 587})-[:RELTYPE*1..2]->()-[:RELTYPE]->(other) RETURN distinct other; 上收到Unknown variable 'UNNAMED35'.。如果我删除*1..100,它会起作用,但当然只会跳一跳。在 Neo4j 3.2.0 上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多