Neo4j中两个(同义)查询的不同结果

时间:2015-04-21 22:25:39

标签: neo4j cypher

我发现有些查询的结果比预期的要少。我已经取了一个缺失的结果并试图强制Neo4j返回这个结果 - 我成功了以下查询:

match (q0),(q1),(q2),(q3),(q4),(q5)
where
  q0.name='v4' and q1.name='v3' and q2.name='v5' and
  q3.name='v1' and q4.name='v3' and q5.name='v0' and

  (q1)-->(q0) and (q0)-->(q3) and (q2)-->(q0) and (q4)-->(q0) and
  (q5)-->(q4)
return *

我认为以下查询在语义上等同于前一个查询。但是在这种情况下,Neo4j根本不会返回任何结果。

match (q1)-->(q0), (q0)-->(q3), (q2)-->(q0), (q4)-->(q0), (q5)-->(q4)
where
  q0.name='v4' and q1.name='v3' and q2.name='v5' and
  q3.name='v1' and q4.name='v3' and q5.name='v0'
return *

我还手动验证了顶点v0v1v3v4v5之间所需的边缘是否存在于数据库中方向。

我是否遗漏了这些查询之间的一些重要区别,还是只是Neo4j的一个错误? (我在Neo4j 2.1.6社区版上测试了这些查询。)

感谢您的任何建议

/编辑:更新到最新版本2.2.1没有任何帮助。

1 个答案:

答案 0 :(得分:1)

这可能不是一个完整的答案,但这是我发现的。

如果我理解正确,这些查询不是同义词。 首先,使用EXPLAIN(或甚至PROFILE)查看内幕。第一个查询将按如下方式执行: enter image description here

第二个问题:

enter image description here

正如您所看到的(即使没有深入研究),这些在效率和语义方面都是不同的查询。

接下来,这里发生了什么:

  • 第一个查询将查看所有(单个)节点,按名称过滤它们,然后 - 尝试根据您的模式对它们进行分组,这将涉及计算笛卡尔积(因此具有巨大的空间复杂度),然后收集那些群体进入较大的群体,然后评估你的其他条件。

  • 第二个查询将首先选择一对与某种关系连接的节点(满足name属性上的条件),然后再投入第三个节点并再次过滤,...,和等到最后。预计每个过滤周期后节点数量将减少。

顺便说一下,您是否可能意外地设置了两次相同的名称(q1q3?)