Cypher:如何在对象数组上使用FOREACH来创建多个节点和多个关系

时间:2015-10-15 05:17:11

标签: neo4j cypher

我在使用此问题标题中描述的提取时遇到问题。我的尝试是以下字符串:

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节点已存在于数据库中,则不执行任何操作。

我非常感谢您提供的帮助

1 个答案:

答案 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指定标签可能有助于提高效果。