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