neo4j "try"创建与节点的关系

标签 neo4j cypher

如何编写下一个 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/

相关文章:

java - 在java中一次加载3个json文件到neo4j数据库中

neo4j - 在 Neo4j 中建模有关数学计算的元数据

neo4j - Cypher/Neo4J 中的集合是什么?

Neo4j 仅在节点存在时添加/更新属性。如果不是,则什么都不做

neo4j - 使用 MATCH 和 CREATE 子句遍历集合

neo4j - 如何获取neo4j中特定节点的所有子节点

javascript - 来自 nodejs 的 Neo4j 多密码查询

neo4j - 在 session.save 上合并两个节点(唯一节点)

Neo4j导入本地CSV文件

neo4j - Neo4j 中按集合成员排序