首页 > 解决方案 > Neo4j:如何创建一个唯一节点而不是一组节点

问题描述

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

  1. areport nodes只连接一个event node
  2. 如果多个indicator nodes具有相同的属性“模式”,那么它们属于同一个事件节点

这是我的查询代码:

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)

并得到如下结果, 在此处输入图像描述

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

更重要的是,我想知道是否有比我更有效的查询代码。

谢谢!

标签: node.jsneo4jcypher

解决方案


我没有任何数据可以确认,但我认为对您的 Cypher 查询稍作改动就会产生您想要的结果。

来自 Neo4j Cypher 手册章节MERGE(我的重点补充)。

在完整模式上使用MERGE时,行为是整个模式匹配,或者创建整个模式。MERGE不会部分使用现有模式 - <strong>要么全部要么全无。如果需要部分匹配,可以通过将模式拆分为多个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创建额外的节点并获取您正在寻找的图形。


推荐阅读