我在使用此问题标题中描述的提取时遇到问题。我的尝试是以下字符串:
FOREACH (_tabobj IN {_tabarray} |
MATCH (a:Superlabel),(b)
WHERE a.id = {_parentid} AND b.id = _tabobj.id
MERGE (a)-[r:INCLUDES]->(b {
name : _tabobj.name
})
我正在尝试仅创建关系,如果它尚未存在于数据库中,并且如果关系已经存在于数据库中则没有任何关系。还尝试仅创建b节点(如果它尚未存在于数据库中),如果b节点已存在于数据库中,则不执行任何操作。
我非常感谢您提供的帮助
答案 0 :(得分:1)
这样的事情怎么样:
MATCH (a:Superlabel {id: {_parentid}})
WITH a, tabarray IN {_tabarray}
UNWIND tabarray AS tabobj
MATCH (b {id: tabobj.id)
MERGE (a)-[r:INCLUDES]->(b {name: tabobj.name})
我通常使用FOREACH
作为最后的手段;)
更简单的解决方案:
MATCH (a:Superlabel {id: {_parentid}}), (b)
WHERE b.id IN EXTRACT(tabobj IN {_tabarray} | tabobj.id)
MERGE (a)-[r:INCLUDES]->(b {name: tabobj.name})
这两个查询的一个重要考虑因素:当匹配b
属性上的id
节点时,将不使用数据库索引(如果有的话),因为索引用于标签/财产对。如果适用,为b
指定标签可能有助于提高效果。