【问题标题】:Neo4j : How to create a unique node instead of set of nodesNeo4j:如何创建一个唯一节点而不是一组节点
【发布时间】:2019-03-26 05:02:13
【问题描述】:

我想根据indicator nodes在一组节点(report nodes)中创建一个新节点(event 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)

得到如下结果,

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

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

谢谢!

【问题讨论】:

  • (:indicator {pattern:}) 的分配方式是否需要明确唯一的 :event 节点?
  • 是的,换一种说法,:event 节点设置为结束 :indicator 节点
  • 如果将MERGE 分成两部分会怎样?即MERGE (report_1)-[:related_to]-&gt;(event:EVENT)MERGE (event)&lt;-[:related_to]-(report_2)
  • split 方法会得到类似的结果,但是经过下面两步后,它们可以很好地解决
  • 那么使用两个MERGE 语句会产生您正在寻找的结果吗?

标签: node.js neo4j cypher


【解决方案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 节点并获取您正在寻找的图形。

【讨论】:

    【解决方案2】:

    终于,我找到了答案。我的解决方案是合并 :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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      相关资源
      最近更新 更多