簡體   English   中英

在neo4j中如何根據數據庫中是否存在節點來選擇創建節點?

[英]How do I choose to create a node based on whether it exists in the database in neo4j?

我嘗試了以下但它拋出了這個錯誤。 如果現有數據庫中沒有具有完全相同屬性的人員節點,我希望只創建一個新的人員節點。

org.neo4j.driver.exceptions.ClientException:無效輸入“R”:預期

MERGE (n:Person{id: abc.id}) 
MERGE (m:Place{place:def.id}) 
MERGE (o:Thing{id:abcd.id})
WITH n,m,o
OPTIONAL MATCH (n) – [:present_at] -> x with n,m,o, collect (distinct x) as known_place
OPTIONAL MATCH (m) – [:is] -> y with n,m,o, collect (distinct y) as known_thing
FOREACH (a in ( CASE WHEN NOT m IN known_place THEN [1] ELSE [] END ) CREATE (n)-[:present_at] ->(m))
FOREACH (a in ( CASE WHEN NOT o IN known_thing THEN [1] ELSE [] END ) CREATE (m)-[:is] ->(o))

該錯誤是由於缺少| 在您的每個FOREACH子句中。 例如,這將修復該語法錯誤:

FOREACH (a in ( CASE WHEN NOT m IN known_place THEN [1] ELSE [] END ) | CREATE (n)-[:present_at] ->(m))
FOREACH (a in ( CASE WHEN NOT o IN known_thing THEN [1] ELSE [] END ) | CREATE (m)-[:is] ->(o))

但是,您的查詢仍然會有許多其他語法錯誤。

事實上,整個查詢可以重構為更簡單、更高效:

WITH {id: 123} AS abc, {id: 234} as def, {id: 345} AS abcd

MERGE (n:Person{id: abc.id}) 
MERGE (m:Place{place: def.id}) 
MERGE (o:Thing{id: abcd.id})
FOREACH (a in ( CASE WHEN NOT EXISTS((n)–[:present_at]->(m)) THEN [1] END ) | CREATE (n)-[:present_at]->(m))
FOREACH (a in ( CASE WHEN NOT EXISTS((m)–[:is]->(o)) THEN [1] END ) | CREATE (m)-[:is]->(o))

暫無
暫無

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

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