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           |
+---------------------+----------------+------+---------+-----------+--------------+