NEO4J Cypher查询:Where子句中的关系方向错误
样本数据: 示例查询NEO4J Cypher查询:Where子句中的关系方向错误,neo4j,cypher,Neo4j,Cypher,样本数据: 示例查询 CREATE (a1:A {title: "a1"}) CREATE (a2:A {title: "a2"}) CREATE (a3:A {title: "a3"}) CREATE (b1:B {title: "b1"}) CREATE (b2:B {title: "b2"}) MATCH (a:A {title: "a1"}), (b:B {title: "b1"}) CREATE (a)-[r:LINKS]->(b) MATCH (a:A {title:
CREATE (a1:A {title: "a1"})
CREATE (a2:A {title: "a2"})
CREATE (a3:A {title: "a3"})
CREATE (b1:B {title: "b1"})
CREATE (b2:B {title: "b2"})
MATCH (a:A {title: "a1"}), (b:B {title: "b1"})
CREATE (a)-[r:LINKS]->(b)
MATCH (a:A {title: "a2"}), (a1:A {title: "a1"})
CREATE (a)-[:CONNECTED]->(a1)
MATCH (a:A), (b:B) return a,b
目标:在where子句中找到一些连接 现在,让我们写一些变体来发现A与B(a2和b3)没有直接连接 知道为什么Q2和Q3的行为方式不同吗,即使方向被指定为双向的这是NEO4J错误吗? 缩小范围的所有积分均应计入at的 在我的另一个查询中发生的异常
更新:将相同内容发布到 更新:NEO4J已经接受了这个错误,因为我们将在3.1版本中修复它
虽然这可能不是一个完整的答案,但对于评论来说,信息太多了。这将有望提供一些有用的见解 我认为这是个错误。以下是从样本数据中得出相同结果的一些变体。它们都应该通过给定的数据(通过返回任何内容)
匹配(a:a)-[r]-(b:b)其中(b)-[r]-(a)返回*
->失败删除r
匹配(a:a)-(b:b)其中(b)-(a)返回*
->通过匹配(a:a)-(r)-(b:b)其中(b)-(a)返回*
->通过添加方向
匹配(a:a)-[r]-(b:b)其中(b)通过
反向顺序
匹配(a:a)-[r]-(b:b)其中(a)-[r]-(b)返回*
->pass
并且,从失败测试的配置文件中
+---------------------+----------------+------+---------+-----------+--------------+
| Operator | Estimated Rows | Rows | DB Hits | Variables | Other |
+---------------------+----------------+------+---------+-----------+--------------+
| +ProduceResults | 1 | 0 | 0 | a | a |
| | +----------------+------+---------+-----------+--------------+
| +SemiApply | 1 | 0 | 0 | a, b, r | |
| |\ +----------------+------+---------+-----------+--------------+
| | +ProjectEndpoints | 1 | 0 | 0 | a, b, r | r, b, a |
| | | +----------------+------+---------+-----------+--------------+
| | +Argument | 2 | 1 | 0 | a, b, r | |
| | +----------------+------+---------+-----------+--------------+
| +Filter | 2 | 1 | 1 | a, b, r | a:A |
| | +----------------+------+---------+-----------+--------------+
| +Expand(All) | 2 | 1 | 3 | a, r -- b | (b)-[r:]-(a) |
| | +----------------+------+---------+-----------+--------------+
| +NodeByLabelScan | 2 | 2 | 3 | b | :B |
+---------------------+----------------+------+---------+-----------+--------------+
和等效通过测试(相反顺序)
请注意每个步骤中步骤1之后的行数。同一计划不应产生不同的结果。我可以推测这是一个与图形修剪快捷方式相关的错误(即,一旦Neo4j沿着一个方向遍历一条边,它就不会在同一个匹配中遍历回同一条边。这是一个反循环故障保护/性能特性),因此,理论上,在从匹配部分反转where部分的顺序之后,Neo4j必须遍历修剪的边以验证关系。如果方向相同,它将自动通过。如果Neo4j尝试反向执行相同的检查,它将失败,因为该边已被修剪。(不过这只是理论。从技术上讲,失败的验证是r验证的反向)我也尝试了a到b或b到a这样的东西,希望其中一个是真的。但那没有';也不行。当我回到笔记本电脑上时,我会添加精确的查询
+---------------------+----------------+------+---------+-----------+--------------+
| Operator | Estimated Rows | Rows | DB Hits | Variables | Other |
+---------------------+----------------+------+---------+-----------+--------------+
| +ProduceResults | 1 | 0 | 0 | a | a |
| | +----------------+------+---------+-----------+--------------+
| +SemiApply | 1 | 0 | 0 | a, b, r | |
| |\ +----------------+------+---------+-----------+--------------+
| | +ProjectEndpoints | 1 | 0 | 0 | a, b, r | r, b, a |
| | | +----------------+------+---------+-----------+--------------+
| | +Argument | 2 | 1 | 0 | a, b, r | |
| | +----------------+------+---------+-----------+--------------+
| +Filter | 2 | 1 | 1 | a, b, r | a:A |
| | +----------------+------+---------+-----------+--------------+
| +Expand(All) | 2 | 1 | 3 | a, r -- b | (b)-[r:]-(a) |
| | +----------------+------+---------+-----------+--------------+
| +NodeByLabelScan | 2 | 2 | 3 | b | :B |
+---------------------+----------------+------+---------+-----------+--------------+
+---------------------+----------------+------+---------+-----------+--------------+
| Operator | Estimated Rows | Rows | DB Hits | Variables | Other |
+---------------------+----------------+------+---------+-----------+--------------+
| +ProduceResults | 1 | 1 | 0 | a | a |
| | +----------------+------+---------+-----------+--------------+
| +SemiApply | 1 | 1 | 0 | a, b, r | |
| |\ +----------------+------+---------+-----------+--------------+
| | +ProjectEndpoints | 1 | 0 | 0 | a, b, r | r, a, b |
| | | +----------------+------+---------+-----------+--------------+
| | +Argument | 2 | 1 | 0 | a, b, r | |
| | +----------------+------+---------+-----------+--------------+
| +Filter | 2 | 1 | 1 | a, b, r | a:A |
| | +----------------+------+---------+-----------+--------------+
| +Expand(All) | 2 | 1 | 3 | a, r -- b | (b)-[r:]-(a) |
| | +----------------+------+---------+-----------+--------------+
| +NodeByLabelScan | 2 | 2 | 3 | b | :B |
+---------------------+----------------+------+---------+-----------+--------------+