本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在多個節點上執行 MERGE
或 CREATE
查詢時,建議將 UNWIND
與單一 MERGE/CREATE 子句搭配使用,而不是對每個節點使用 MERGE/CREATE 子句。對一個節點使用一個子句的查詢會導致執行計畫效率低下,因為每行都需要最佳化。這會導致查詢的大部分執行時間花費在靜態處理,而不是實際更新。
每個節點有一個子句不是最佳的,因為它不會隨著節點數量的增加而擴展:
MERGE (p1:Person {name: 'NameA'})
ON CREATE SET p1 += {prop1: 'prop1V1', prop2: 'prop2V1'}
MERGE (p2:Person {name: 'NameB'})
ON CREATE SET p2 += {prop1: 'prop1V2', prop2: 'prop2V2'}
MERGE (p3:Person {name: 'NameC'})
ON CREATE SET p3 += {prop1: 'prop1V3', prop2: 'prop1V3'}
使用 UNWIND
搭配一個 MERGE/CREATE 子句允許相同的行為,但執行計畫更理想。考慮到這一點,變更後的查詢會如下所示:
## If not using custom id for nodes/relationship
UNWIND [{name: 'NameA', prop1: 'prop1V1', prop2: 'prop2V1'}, {name: 'NameB', prop1: 'prop1V2', prop2: 'prop2V2'}, {name: 'NameC', prop1: 'prop1V3', prop2: 'prop1V3'}] AS props
MERGE (p:Person {name: props.name})
ON CREATE SET p = props
## If using custom id for nodes/relationship
UNWIND [{`~id`: '1', 'name': 'NameA', 'prop1: 'prop1V1', prop2: 'prop2V1'}, {`~id`: '2', name: 'NameB', prop1: 'prop1V2', prop2: 'prop2V2'}, {`~id`: '3', name: 'NameC', prop1: 'prop1V3', prop2: 'prop1V3'}] AS props
MERGE (p:Person {`~id`: props.id})
ON CREATE SET p = removeKeyFromMap(props, '~id')