我发现有些查询的结果比预期的要少。我已经取了一个缺失的结果并试图强制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 *
我还手动验证了顶点v0
,v1
,v3
,v4
和v5
之间所需的边缘是否存在于数据库中方向。
我是否遗漏了这些查询之间的一些重要区别,还是只是Neo4j的一个错误? (我在Neo4j 2.1.6社区版上测试了这些查询。)
感谢您的任何建议
/编辑:更新到最新版本2.2.1没有任何帮助。
答案 0 :(得分:1)
这可能不是一个完整的答案,但这是我发现的。
如果我理解正确,这些查询不是同义词。
首先,使用EXPLAIN
(或甚至PROFILE
)查看内幕。第一个查询将按如下方式执行:
第二个问题:
正如您所看到的(即使没有深入研究),这些在效率和语义方面都是不同的查询。
接下来,这里发生了什么:
第一个查询将查看所有(单个)节点,按名称过滤它们,然后 - 尝试根据您的模式对它们进行分组,这将涉及计算笛卡尔积(因此具有巨大的空间复杂度),然后收集那些群体进入较大的群体,然后评估你的其他条件。
第二个查询将首先选择一对与某种关系连接的节点(满足name
属性上的条件),然后再投入第三个节点并再次过滤,...,和等到最后。预计每个过滤周期后节点数量将减少。
顺便说一下,您是否可能意外地设置了两次相同的名称(q1
和q3
?)