shortestPath关系不能反映正确的方向

时间:2017-12-22 10:00:41

标签: neo4j

我是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)

结果是它返回"父亲"而不是" SON"。

如果我将查询更改为[*..6]->(o2)," SON"退回。

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

所以:

  1. 原始查询可以处理没有传出关系的节点,但可能会返回错误的关系。
  2. 修改后的查询可以返回正确的关系(到目前为止),但无法应对"没有外出关系"节点。
  3. 我当然可以将每个节点更改为至少有一个传出关系来修复问题2但这太冗余了。

    希望得到你的建议。

1 个答案:

答案 0 :(得分: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)