Cypher Merge子句中的多部分模式

时间:2017-04-12 20:19:57

标签: neo4j cypher

给出以下图表:

(a)<--(b)-->(c)<--(d)-->(e)<--(f)-->(a)

我认为(目前)使用merge子句创建节点(g)是不可能的:

(g)-->(a)
(g)-->(c)
(g)-->(e)

原因是它需要逗号来描述上述模式,而MERGE子句不接受逗号。例如(a)<--(g)-->(c), (g)-->(e)

为便于参考,请参见下图。给定该图(节点6除外),我无法使用MERGE命令创建节点6.

picture of graph

有人想出办法吗?我相信需要添加新的功能,但是我希望能够更合理地确定在开始这条道路之前不存在可行的解决方法。

1 个答案:

答案 0 :(得分:0)

目前无法在Cypher或APOC中执行此操作。也就是说,有一个解决方法。这有点手动,你需要在有问题的节点上获取锁(我们将使用APOC),我们将使用OPTIONAL MATCHWHERE ... IS NULL来确定是否中心节点存在,然后仅在它不存在时创建它。

为此,我在添加节点6之前使用以下示例图来模仿你的:

create (zero:Node{name:0})
create (one:Node{name:1})
create (two:Node{name:2})
create (three:Node{name:3})
create (four:Node{name:4})
create (five:Node{name:5})

create (zero)<-[:TYPE]-(one)-[:TYPE]->(two)
create (two)<-[:TYPE]-(three)-[:TYPE]->(four)
create (four)<-[:TYPE]-(five)-[:TYPE]->(zero)

现在,要合并的查询

match (node:Node)
where node.name in [0,2,4]

with collect(node) as nodes
call apoc.lock.nodes(nodes)
with nodes[0] as first, nodes[1] as second, nodes[2] as third

optional match (first)<-[:TYPE]-(center)-[:TYPE]->(second)
where (center)-[:TYPE]->(third)
with first, second, third, center
where center is null
// above 'where' will result in no rows if center exists, preventing creation of duplicate pattern below
create (first)<-[:TYPE]-(newCenter:Node{name:6})-[:TYPE]->(second)
create (newCenter)-[:TYPE]->(third)