我有一个密码查询,用于批量创建节点。
查询
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中的节点。这里需要性能
答案 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)
)
...
如果此查询的性能不足,则应尝试将该查询分为多个部分(每个关系一个),并通过手动管理事务的提交来对代码进行批处理。