[英]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.