避免在查询中进行 ~id 计算
在查询中使用自定义 ID 时,请务必在查询之外执行静态计算,并在参数中提供这些值。如果提供静态值,引擎便能更好地优化查找,避免扫描和筛选这些值。
如果要在数据库中存在的节点之间创建边缘,则可以选择使用以下查询:
UNWIND $sections as section MATCH (s:Section {`~id`: 'Sec-' + section.id}) MERGE (s)-[:IS_PART_OF]->(g:Group {`~id`: 'g1'})
参数为:
parameters={sections: [{id: '1'}, {id: '2'}]}
在上述查询中,section 的 id 是在查询中计算的。由于计算是动态的,因此引擎无法静态内联 ID,最终会扫描所有 section 节点。然后,引擎对所需的节点执行后筛选。如果数据库中有许多 section 节点,这样做成本可能会很高。
避免扫描和筛选所有 section 节点的更好方法是,在传递到数据库的 ID 中加上 Sec- 前缀:
UNWIND $sections as section MATCH (s:Section {`~id`: section.id}) MERGE (s)-[:IS_PART_OF]->(g:Group {`~id`: 'g1'})
参数为:
parameters={sections: [{id: 'Sec-1'}, {id: 'Sec-2'}]}