出乎意料的结果。预计重复路径

时间:2015-12-17 14:56:04

标签: neo4j

示例图:

Matrix-->Neo
Matrix-->Morpheus

在neo4版本1. *查询返回Neo和Morpheus

START n=node(0)
MATCH n<--matrix-->m
RETURN m

但在2. *它只返回Morpheus。为什么?

真实的例子:

Graph Setup:
create 
(_0:`Crew`  {`name`:"Neo"}),
(_1:`Crew`  {`name`:"Morpheus"}),
(_2:`World`  {`name`:"Matrix"}),
_2-[:LIVE]->_1,
_2-[:LIVE]->_0


Query:
START
   n=node(*)
MATCH
  n<--matrix-->Neo
WHERE
  n.name="Neo"
RETURN
  n,
  Neo

现场测试:http://console.neo4j.org/?id=vuo9ut

实际结果:

| n                      |  Neo                         |
| (0:Crew {name:"Neo"})  |  (1:Crew {name:"Morpheus"})  |

预期结果:

| n                      |  Neo                         |
| (0:Crew {name:"Neo"})  |  (0:Crew {name:"Neo"})       |
| (0:Crew {name:"Neo"})  |  (1:Crew {name:"Morpheus"})  |

1 个答案:

答案 0 :(得分:0)

您可以在上面链接的控制台中针对不同的Cypher解析器版本测试相同的查询。只需选择右上角的“选项”,然后选择“Cypher parser v1.9”。为您的示例查询执行此操作,我得到“最新Cypher版本”和“Cypher解析器v1.9”的相同结果。如果您对同一查询的结果不同,请提交问题。

请注意,Cypher中不再需要START子句,因此(根据您的示例图表)您的查询可以像这样重写:

MATCH (n:Crew)<-[:LIVE]-(w:World)-[:LIVE]->(neo:Crew)
WHERE n.name = "Neo"
RETURN neo, n

+------------------------------------------------+
| neo                      | n                   |
+------------------------------------------------+
| Node[1]{name:"Morpheus"} | Node[0]{name:"Neo"} |
+------------------------------------------------+

这个问题基本上是在询问“其他船员和Neo一样生活在同一个世界?”。查看控制台中的数据以及查询报告的结果是我希望查询返回的内容。

您未获得预期结果的原因是图表中不存在该模式。要获得您期望的结果,您必须将查询修改为以下内容:

MATCH (n:Crew)<-[:LIVE]-(w:World)
WHERE n.name = "Neo"
MATCH (neo)<-[:LIVE]-(w)
RETURN neo, n

+------------------------------------------------+
| neo                      | n                   |
+------------------------------------------------+
| Node[1]{name:"Morpheus"} | Node[0]{name:"Neo"} |
| Node[0]{name:"Neo"}      | Node[0]{name:"Neo"} |
+------------------------------------------------+

本质上是在问“Neo生活在哪个世界?生活在这个世界的所有船员,包括Neo?”