【问题标题】:Neo4j Path returned with falsely alternating relationship directions in cypher-shellNeo4j 路径在 cypher-shell 中以错误的交替关系方向返回
【发布时间】:2017-09-18 21:28:09
【问题描述】:

无法理解返回路径中的关系方向。

我有一个这样的图表

(:START)-[:NEXT]->(:NODE)-[:NEXT]->(:NODE)...

现在我正在匹配从起始节点开始向:NEXT 方向的所有路径,最长为 10,例如。查询看起来像

MATCH t=((:START)-[:NEXT*..10]->(:NODE))
RETURN t;

我得到的输出路径似乎混淆了:NEXT 方向,例如

(:START)-[:NEXT]->(:NODE)<-[:NEXT]-(:NODE)-[:NEXT]->(:NODE)<-...

我无法理解交替方向的来源。

编辑: 该图只是一条直线(有一个方向)。没有循环,没有分支。请使用以下内容在 shell 中复制场景:

CREATE (s:START);
MATCH (s:START) MERGE (s)-[:NEXT]->(a:NODE)-[:NEXT]->(b:NODE)-[:NEXT]->(c:NODE)-[:NEXT]->(d:NODE);
MATCH t=((:START)-[:NEXT*..10]->()) return t;

+------------------------------------------------------------------------------+
| t                                                                            |
+------------------------------------------------------------------------------+
| (:START)-[:NEXT]->(:NODE)                                                    |
| (:START)-[:NEXT]->(:NODE)<-[:NEXT]-(:NODE)                                   |
| (:START)-[:NEXT]->(:NODE)<-[:NEXT]-(:NODE)-[:NEXT]->(:NODE)                  |
| (:START)-[:NEXT]->(:NODE)<-[:NEXT]-(:NODE)-[:NEXT]->(:NODE)<-[:NEXT]-(:NODE) |
+------------------------------------------------------------------------------+

看看在返回的路径中,箭头如何交替方向?这就是让我困惑的地方。

【问题讨论】:

  • 请查看here 并执行查询。我只编辑了您的查询,将:ST 更改为:START:N 更改为:NEXT。我相信这些是拼写错误。对我来说,结果看起来不错,不是吗?
  • 请参阅上面的问题并纠正错别字
  • 我再次逐步执行了您的查询,结果看起来还可以。看看here
  • 这很酷。但它仍然没有回答为什么箭头方向在 cypher-shell 中显示为交替的问题
  • 问题确实出现在 cypher-shell 中。我更新了我的答案,并在 cypher-shell 的 Github 中打开了 issue

标签: neo4j cypher


【解决方案1】:

来自原始问题的编辑:

编辑:该图只是一条直线(有一个方向)。不 循环,没有分支。请在shell中复制场景 带有以下内容:

执行cypher-shell 中的语句确实会出现问题。在我看来是一个错误。我在 cypher-shell 的 Github 中搜索了这个问题,一无所获。于是我开了一个issue

编辑 2:

The issue 我在 Github 上打开的这个commit 被引用了。这个修复可能会在下一个版本中发布。

编辑 3

问题已在this commit 中关闭和修复。


原答案如下:

我在这里模拟了你的场景。看:

样本数据集:

CREATE (node1:Node {id:1})
CREATE (node2:Node {id:2})
CREATE (node3:Node {id:3})
CREATE (node4:Node {id:4})
CREATE (node1)-[:NEXT]->(node2)
CREATE (node2)-[:NEXT]->(node3)
CREATE (node3)-[:NEXT]->(node4)
CREATE (node4)-[:NEXT]->(node2)

查询:

MATCH t=((:Node {id:1})-[:NEXT*..10]->(:Node {id:4}))
RETURN t;

结果:

如您所见(如问题中所述)(:Node {id:4})-[:NEXT]-&gt;(:Node {id:2}) 已返回。然而,这是因为在您的 Neo4j 浏览器中启用了“连接结果节点”选项。您可以在 Neo4j 浏览器设置中禁用它。看:

禁用“连接结果节点”并再次运行查询后:

请注意,“连接结果节点”选项仅适用于结果的图形可视化。也就是说:(:Node {id:4})(:Node {id:2}) 之间的关系实际上并不存在于结果中,如果将可视化更改为“表格”、“文本”或“代码”,则不存在。

【讨论】:

  • 感谢您非常详尽的回答!不幸的是,我必须进一步澄清。我的图中没有有向循环。请在上面的原始问题中查看我的编辑
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多