【问题标题】:shortestPath relationship does not reflect the correct directionshortestPath 关系没有反映正确的方向
【发布时间】:2017-12-22 19:26:23
【问题描述】:

我是 Neo4j 的新手,正在开发一个小型网站。

我已经设置了节点和它们之间的关系。对于大多数配对节点,我创建了一个相互链接。例如:

Zeus - FATHER -> Apollo
Appollo - SON -> Zeus

我使用shortestPath 找到了这两者之间可能的最短路径:

MATCH (o1 { name: 'Apollo' }),(o2 { name: 'Zeus' }), p = shortestPath((o1)-[*..6]-(o2)) RETURN nodes(p), relationships(p)

结果是它返回“父亲”而不是“儿子”。

如果我将查询更改为[*..6]->(o2),则返回“SON”。

但我需要考虑搜索可能会使o1 成为没有传出关系的节点,在这种情况下,上述修改的查询会失败。

所以:

  1. 原始查询可以处理没有出站关系的节点,但可能会返回错误的关系。
  2. 修改后的查询可以返回正确的关系(到目前为止),但不能处理“无出关系”节点。

我当然可以将每个节点更改为至少有一个传出关系来修复问题 2,但这太多余了。

希望得到您的建议。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    像你这样创建双向关系是一种不好的做法,特别是当它是双射时。

    您正在复制数据库中的一些数据(很明显,如果 ZeusApollo 的父亲,ApolloZeus 的儿子)。

    这个查询:

    MATCH 
      (o1 { name: 'Apollo' }),
      (o2 { name: 'Zeus' }), 
      p = shortestPath((o1)-[*..6]-(o2)) 
    RETURN nodes(p), relationships(p)
    

    只搜索一个最短路径。但由于重复,实际上有两条最短路径。您可以将shortestpath 函数替换为allshortestpaths 以查找所有内容。所以你会得到sonfather 结果。

    或者你也可以给 shortestpath 函数,它可以像这样遍历的关系类型列表:

    MATCH 
      (o1 { name: 'Apollo' }),
      (o2 { name: 'Zeus' }), 
      p = shortestPath((o1)-[:FATHER*..6]-(o2)) 
    RETURN nodes(p), relationships(p)
    

    【讨论】:

    • 感谢您的回复,但我不同意您的观点,因为如果 A 是 B 的父亲,B 可能是 A 的儿子或女儿。或者,如果 A 是 B 的 SON,B 可能是 A 的父亲或母亲。这种关系只有一个方向,不能归纳出什么是互惠关系类型。
    • 你可以有一个rel类型PARENT_OF,并且在每个节点上你可以指定sexe。
    • 这样做是在损害 Neo4j。我们必须搜索其他属性,而不是快速直接地搜索“链接”——这是 Neo4j 最擅长的。我认为这不是一个好主意。
    • 这取决于您的需求。在您的情况下,当您需要创建或删除 FATHER 链接时,您还必须创建/删除 SONDAUGHTER 关系。所以读取会更快(在某些情况下),但写入会更慢,并且您必须自己维护数据的一致性。
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 2021-07-06
    • 2011-09-19
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多