【问题标题】:Relationship Creation for other properties skipped if property is Null in Cypher query如果 Cypher 查询中的属性为 Null,则跳过其他属性的关系创建
【发布时间】:2019-03-04 07:13:21
【问题描述】:

我有一个用于批量创建节点的密码查询。

查询

UNWIND {batch} as row MERGE(m:TempEncounter {encounterId: row.encounterId}) ON CREATE SET m+=row
WITH m,row MATCH (u:Users {userId:  row.creator }) MERGE (m)-[:USERS]->(u)
WITH m,row MATCH (l:Location {locationId:  row.locationId }) MERGE (m)-[:LOCATION]->(l)
WITH m,row MATCH (p:Patient {patientId:  row.patientId }) MERGE (m)-[:PATIENT]->(p)
WITH m,row MATCH (e:EncounterType {encounterTypeId:  row.encounterType }) MERGE (m)-[:ENCOUNTERTYPE]->(e)
WITH m,row MATCH (u2:Users {userId:  row.voidedBy }) MERGE (m)-[:USERS]->(u2)
return m;

上述密码查询的问题是,假设 row1 的 locationId 为 NULL(但其他行可能不是),则不会创建从 LOCATION 到 USERS 的关系。尽管可能会出现其他属性,例如(voidedBy, enounterType)

我怎样才能改进我的密码查询,以便它会跳过不存在于行中的特定关系,而是建立其他存在于行中的关系。

我正在使用这个查询来增加我在 neo4j 中的节点。这里需要性能

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我不知道这个查询是否会更高效,但你想要的方法如下:

    UNWIND {batch} as row 
      MERGE(m:TempEncounter {encounterId: row.encounterId}) 
        ON CREATE SET m+=row
      WITH m,row 
        OPTIONAL MATCH (u:Users {userId:  row.creator })
        FOREACH( node IN filter(x IN [u] WHERE x IS NOT NULL) |
          MERGE (m)-[:USERS]->(node)
        )
      WITH m, row
        OPTIONAL MATCH (l:Location {locationId:  row.locationId })
        FOREACH( node IN filter(x IN [l] WHERE x IS NOT NULL) |
          MERGE (m)-[:LOCATION]->(node)
        )
      ...
    

    如果此查询的性能不够好,您应该尝试将此查询拆分为多个部分(每个关系一个),并通过手动管理我的事务提交在我的代码中执行批处理。

    【讨论】:

    • 谢谢,它按预期工作。关于性能,我必须对其进行分析和检查。不幸的是,我没有足够的声望来投票给你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2020-06-22
    • 2021-08-31
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多