我想根据event nodes
在一组节点(report nodes
)中创建一个新节点(indicator nodes
)(每个报告节点都有几个与其相关的指标节点)。我想使用以下规则设置新的event nodes
:
report nodes
仅连接了一个event node
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)
但是我希望三个报告节点属于一个事件节点。 我想知道我应该对查询进行哪些更改,或者在获得两个事件节点后应该执行下一步。
此外,我想知道还有比我更有效的查询代码。
谢谢!
答案 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)