簡體   English   中英

NEO4J Cypher查詢:Where子句中的關系方向錯誤

[英]NEO4J Cypher Query: Relationship Direction Bug in Where Clause

樣本數據:

在此輸入圖像描述

示例查詢

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)

// Q1. Both work fine
MATCH (a:A) WHERE (a)--(:B) RETURN a
MATCH (a:A) WHERE (:B)--(a) RETURN a

// Q2. Works
MATCH (a:A)-[r]-(b:B) WHERE (a)-[r]-(b) RETURN a

// Q3. Fails
MATCH (a:A)-[r]-(b:B) WHERE (b)-[r]-(a) RETURN a

知道為什么即使方向被指定為雙向,Q2,Q3的行為也不一樣嗎? 這是NEO4J的錯誤嗎?

所有學分stdob這個答案對於縮小這是我在其他的查詢發生異常。


更新:發布相同的NEO4J GitHub問題

更新:NEO4J已接受此錯誤,將修復它在3.1

在此輸入圖像描述

雖然這可能不是一個完整的答案,但評論的信息太多了。 這應該有希望提供一些有用的見解。

我認為這是一個錯誤。 以下是應從樣本數據中得到相同結果的一些變體。 它們都應該傳遞給定的數據(傳遞返回任何東西)

MATCH (a:A)-[r]-(b:B) WHERE (b)-[r]-(a) RETURN * - >失敗

刪除r
MATCH (a:A)--(b:B) WHERE (b)--(a) RETURN * - >通過
MATCH (a:A)-[r]-(b:B) WHERE (b)--(a) RETURN * - >通過

添加方向
MATCH (a:A)-[r]-(b:B) WHERE (b)<-[r]-(a) RETURN * - >通過

相反的順序
MATCH (a:A)-[r]-(b:B) WHERE (a)-[r]-(b) RETURN * - >傳球

並且,從失敗的測試的配置文件

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

請注意每個步驟1之后的行計數。 同一計划不應產生不同的結果。 我可以推測這是一個與圖形修剪快捷方式相關的錯誤(即,一旦Neo4j在一個方向上遍歷一條邊,它就不會在相同的匹配中遍歷同一條邊。這是一個反周期的自動防故障/性能特征)因此,理論上,在從匹配部分的where部分反轉順序后,Neo4j必須遍歷修剪邊緣以驗證關系。 如果它是相同的方向,它會自動通過。 如果Neo4j嘗試反向執行相同的檢查,則會因為該邊緣已被修剪而失敗。 (這只是理論上的。失敗的驗證在技術上反過來驗證)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM