如果Cypher查询中的属性为Null,则跳过其他属性的关系创建

时间:2018-09-28 09:56:15

标签: neo4j cypher

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

查询

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中的节点。这里需要性能

1 个答案:

答案 0 :(得分:0)

我不知道此查询是否会更有效,但是执行所需操作的方法如下:

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

如果此查询的性能不足,则应尝试将该查询分为多个部分(每个关系一个),并通过手动管理事务的提交来对代码进行批处理。