Neo4j:如何创建唯一节点而不是节点集

时间:2019-03-23 10:14:26

标签: node.js neo4j cypher

我想根据event nodes在一组节点(report nodes)中创建一个新节点(indicator nodes)(每个报告节点都有几个与其相关的指标节点)。我想使用以下规则设置新的event nodes

  1. 一个report nodes仅连接了一个event node
  2. 如果多个indicator nodes具有相同的属性“ pattern”,则它们属于同一事件节点

这是我的查询代码:

OPTIONAL MATCH 
(indicator_1_1:indicator)<-[:REFERS_TO]-(report_1:report)-[:REFERS_TO]->(indicator_1_2:indicator),
(indicator_2_1:indicator)<-[:REFERS_TO]-(report_2:report)-[:REFERS_TO]->(indicator_2_2:indicator)
WHERE
indicator_1_1.pattern=indicator_2_1.pattern
and
indicator_1_2.pattern=indicator_2_2.pattern
MERGE
(report_1)-[:related_to]->(event:EVENT)<-[:related_to]-(report_2)

并得到如下结果, enter image description here

但是我希望三个报告节点属于一个事件节点。 我想知道我应该对查询进行哪些更改,或者在获得两个事件节点后应该执行下一步。

此外,我想知道还有比我更有效的查询代码。

谢谢!

2 个答案:

答案 0 :(得分:1)

我没有任何数据可以确认,但是我认为对Cypher查询进行小的更改将产生您想要的东西。

摘自MERGE上的《 Neo4j Cypher手册》一章(我的重点已加)。

  

在完整模式下使用MERGE时,其行为是   整个模式匹配,或创建整个模式。 MERGE将   不部分使用现有模式— 全部或全部。如果   需要部分匹配,这可以通过拆分一个   模式化为多个MERGE子句。

所以,在此之后,我想如果您改变了

MERGE (report_1)-[:related_to]->(event:EVENT)<-[:related_to]-(report_2)

MERGE (report_1)-[:related_to]->(event:EVENT)
MERGE (event)<-[:related_to]-(report_2)

...您将阻止创建额外的:EVENT节点,并获取所需的图形。

答案 1 :(得分:0)

最后,我找到了答案。我的解决方案是合并:event节点,然后合并关系

第1步:合并:event节点

MATCH ()-[r_1:related_to]->(event_1:EVENT)<-[r_2:related_to]-()-[r_3:related_to]->(event_2:EVENT)<-[r_4:related_to]-()
call apoc.refactor.mergeNodes([event_1,event_2]) YIELD node
RETURN node

第2步:合并重复关系

MATCH (X)-[r]-(Y)
WITH X,Y, TAIL (collect(r)) as rr
FOREACH (r IN rr | DELETE r)