簡體   English   中英

如果Cypher查詢中的屬性為Null,則跳過其他屬性的關系創建

[英]Relationship Creation for other properties skipped if property is Null in Cypher query

我有一個用於批量創建節點的密碼查詢。

詢問

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中的節點。 這里需要性能

我不知道此查詢是否會更高效,但是執行所需操作的方法如下:

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

如果此查詢的性能不足,則應嘗試將此查詢分為多個部分(每個關系一個),並通過手動管理事務的提交來對代碼進行批處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM