如何编写下一个 cyhper 查询而不出错?
Match (n: {id :"someid"}),(x {id:"otherId"})
OPTIONAL MATCH (n)-[]->(t:Other)
merge x-[]->(t)`
问题是 t
可能会为 null 并且会出现错误:
预期在 t 处找到节点,但什么也没找到 Some(null)
这是完整的查询:
MATCH (traveler:${labels.N_TRAVELER} {id: {traveler}.id})
OPTIONAL MATCH (traveler)-[r:${labels.R_TRAVELER_LATEST_EVENT}]->(prev:${labels.N_EVENT})
OPTIONAL MATCH (interest:${labels.N_INTERESTS}) WHERE interest.id IN {interests}
DELETE r
MERGE (traveler)-[:${labels.R_TRAVELER_LATEST_EVENT}]->(trip:${labels.N_TRIP_EVENT})
ON CREATE SET trip={trip}
MERGE (traveler)-[:${labels.R_TRAVELER_WRITE_TRIP}]->(trip)
MERGE (trip)-[:${labels.R_TRIP_INTEREST}]->(interest)
WITH trip, collect(prev) as prevs
UNWIND prevs as prev
MERGE (trip)-[:${labels.R_EVENT_PREV_EVENT}]->(prev)
WITH trip
RETURN properties(trip) as trip`
所有的标签。
只是字符串。{interests}
是一个id数组
基本上我想创建一个旅行链接列表
最佳答案
第一个解决方案是仅使用 MATCH,如果没有 t
节点,它将停止查询。
MATCH (n {id:"someid"}), (x {id:"otherId"})
MATCH (n)-->(t:Other)
MERGE (x)-[:RELATIONSHIP]->(t)
如果此查询部分是较大查询的一部分,并且您之后需要做的事情是收集 t,则第二个解决方案是收集 t,在 null 的情况下,集合将为空,因此仅当它包含元素时才可以迭代:
MATCH (n {id:"someid"}), (x {id:"otherId"})
OPTIONAL MATCH (n)-->(t:Other)
WITH n, x, collect(t) as ts
UNWIND ts as t
MERGE (x)-[:RELATIONSHIP]->(t)
WITH n, x
// continue query
关于neo4j "try"创建与节点的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137227/