[英]How does Neo4J cypher OPTIONAL MATCH works?
我今天在理解 cypher 中的 OPTIONAL MATCH 子句時遇到了問題。 讓我們考慮這個簡單的案例:
CREATE (:a {type:"group"})-[:a_rel]->(:a {type: "app"})-[:b_rel]->(:b);
這將創建 2 個具有不同類型屬性的“a”節點,以及一個“b”節點。 它們都在一個簡單的路徑中 a-->a-->b
然后,我試圖匹配具有“組”類型的“a”節點,連接到另一個“a”節點,可選地連接到“b”節點。
因此,如果我運行以下查詢,我希望它不會返回任何內容:
MATCH(x:a)-->(y:a)
where x.type = "group"
OPTIONAL MATCH (y)-->(z:b)
where z IS NULL
return y
但它總是返回路徑的第二個“a”節點,在 where 子句中使用 IS NULL 或 IS NOT NULL。
你能解釋一下我在這里不明白的地方嗎? 在我真正的 model 中,第二個“a”節點可以連接或不連接到“b”節點。 我想檢索所有未連接到任何“b”節點的節點。
非常感謝你的幫助
雷米
OPTIONAL MATCH 所做的是,它試圖找出圖中的模式。如果找到匹配模式,則返回 Node,否則將其替換為 NULL。我希望這會消除造成的混亂。
只要MATCH
子句找到匹配項,查詢將始終返回y
。
這是因為OPTIONAL MATCH
不需要匹配任何內容來進行查詢。 這就是為什么它是“可選的”。
這是做你想做的事情的一種方法:
MATCH (x:a)-->(y:a)
WHERE x.type = "group" AND NOT (y)-->(:b)
RETURN y
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.