簡體   English   中英

密碼2中的多個OPTIONAL MATCH子句

[英]multiple OPTIONAL MATCH clauses in cypher 2

我在使用2個可選路徑從圖表中選擇數據時遇到問題。 假設節點A,B,C,其中A與B和C具有可選關系。

如果我查詢

match (a:A) where a.xx = XX optional match (a:A)-->(b:B) return ...

要么

match (a:A) where a.xx = XX optional match (a:A)-->(c:C) return ...

一切都按預期工作。

如果我結合2:

match (a:A) where a.xx = XX 
optional match (a:A)-->(b:B) 
optional match (a:A)-->(c:C) 
return ...

然后我只得到(經過長時間的查詢時間)一個未知的錯誤。

返回從a,b,c中選擇屬性,並使用限制來限制返回的數據量。 是否不可能有多個可選匹配?

更新:當我將查詢更改為

match (a1:A) where a.xx = XX 
optional match (a2:A)-->(b:B) where a2.uid = a1.uid
optional match (a3:A)-->(c:C) where a3.uid = a1.uid
return ...

如果uid是唯一的索引id,則查詢返回所需的結果。 它的運行速度非常慢(如果uid是索引,則約為60秒;如果uid具有唯一約束,則約為40秒)數據集不是我稱之為巨大的數據集:6500,b 86和c 90000條目。

鑒於你已經匹配A一次,你為什么要重新匹配?

MATCH (a1:A) WHERE a.xx = XX 
OPTIONAL MATCH (a2:A)-->(b:B) WHERE a2.uid = a1.uid
OPTIONAL MATCH (a3:A)-->(c:C) WHERE a3.uid = a1.uid

可以更好地表達:

MATCH (a:A) WHERE a.xx = XX 
OPTIONAL MATCH (a)-->(b:B)
OPTIONAL MATCH (a)-->(c:C)

這看起來非常接近你最初的例子,但沒有理由讓它表現糟糕。 如果你可以在關系匹配上放置一個類型,它會表現得更好:

MATCH (a:A) WHERE a.xx = XX 
OPTIONAL MATCH (a)-[:REL]->(b:B)
OPTIONAL MATCH (a)-[:REL]->(c:C)

請注意,在將已經綁定的節點傳送到OPTIONAL MATCH子句中時,您不需要重新標記它們。

對於初始匹配,您應該使用任何屬性的索引:

CREATE INDEX ON :A(xx)

您可以在控制台中嘗試此操作以查看它是否正常工作:

MATCH (n:Crew)
OPTIONAL MATCH (n)-[:KNOWS]-m
OPTIONAL MATCH (n)-[:LOVES]-t
RETURN n AS Neo,COLLECT(m) AS knows, COLLECT(t) AS loves

問題是兩個可選匹配創建了一個交叉產品 ,所以你想要將第二個基數降低,即

create index on :A(xx);

MATCH (a:A) WHERE a.xx = XX 
OPTIONAL MATCH (a)-->(b:B) 
WITH a, collect(b) as b_nodes
OPTIONAL MATCH (a)-->(c:C) 
RETURN a, b_nodes, collect(c) as c_nodes`

是的,您可以使用多個可選匹配。 例如,在console.neo4j.org中:

MATCH (n:Crew)-[r:KNOWS]-(m)
OPTIONAL
MATCH (n:Crew)-[r:KNOWS]-(b)
OPTIONAL
MATCH (n:Crew)-[r:KNOWS]-(c)
RETURN n,b,c

暫無
暫無

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

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