neo4j - 在创建关系时返回不匹配的节点 Neo4j Cypher
问题描述
我写了一个脚本来在neo4j中批量创建一堆关系。这是密码:
:param batch => [{startId: 'abc123', endId: 'abc321'}, {startId: 'abc456', endId: 'abc654']
UNWIND $batch as row
MATCH (from {id: row.startId}
MATCH (to {id: row.endId}
CREATE (from)-[rel:HAS]->(to)
RETURN rel
可能有一些 startId/endId 条目与任何节点都不匹配并且被静默忽略的问题。有没有办法返回不匹配任何节点的行列表并为匹配的节点创建关系?
一旦 id 找不到 startId/endId,我就尝试 OPTIONAL MATCH 快速失败,但是查询执行速度非常慢。
解决方案
首先,您应该始终尝试为用于启动 a 的节点指定一个标签MATCH
(除非该MATCH
模式使用任何已绑定的节点)。否则,必须扫描数据库中的每个节点。此外,您应该考虑使用索引来加速您MATCH
的 s (但同样,您需要指定标签)。
这是一个使用 APOC 过程apoc.do.when在适当时创建新关系的查询。它返回每个row
和相应的新关系(或者NULL
如果没有找到任何一个节点):
UNWIND $batch as row
OPTIONAL MATCH (from:Foo {id: row.startId})
OPTIONAL MATCH (to:Foo {id: row.endId})
CALL apoc.do.when(
from IS NOT NULL AND to IS NOT NULL,
'CREATE (from)-[rel:HAS]->(to) RETURN rel',
'RETURN NULL AS rel',
{from: from, to: to}) YIELD value
RETURN row, value.rel AS rel
推荐阅读
- python-3.x - 将字符串转换为 hacspec.speclib。python中的_array
- angular - 调用时如何访问附加到 cchild 组件的指令
- angular - 材料表中的角度 > 过滤器 x 2
- reactjs - Joi:要求 oneOf 字段为真
- python-3.x - openpyxl (python) 和 Combobox 和 Excel 按钮
- c# - NavigationException:Blazor 中的“Exception_WasThrown”
- spring - 对象中的空属性由 mono.block 检索
- node.js - 如何将 SSL 后端与来自客户端 Web 浏览器的自定义证书一起使用
- terraform - 通过 Terraform 在 KVM 上自动部署机器
- google-apps-script - 应用程序脚本中的xpath?