【问题标题】:Replace a Relationship-Node->Relationship construct with one Realtionship containing the label of the replaced node用一个包含被替换节点标签的 Realtionship 替换一个关系节点->关系结构
【发布时间】:2021-07-31 18:58:09
【问题描述】:

我有一个图表,如果有以下结构:

(a)-[b:Input]->(c:Data)-[e:Output]->(f)

我想将 b,c,e 替换为与来自 c: 的标签的关系

(a)-[n:Data]->(f)

标签应该是自动生成的。我有多个 c 标签,例如:Data、AMC、Door、New_HS 等。 所以新创建的关系的标签应该是这样创建的:

[n:title = c.Label]

【问题讨论】:

  • 到目前为止您尝试过什么?您有错误想向我们展示/解释吗?
  • 我试过match (a)-[o:FOLLOWS]->(b)-[l:REVIEWED]->(c) create (a)-[r:b.name]->(c) -> 错误:无效输入'.':预期和match (a)-[o:FOLLOWS]->(b)-[l:REVIEWED]->(c) create (a)-[r:title =b.name]->(c) -> 错误:无效输入'=':预期
  • 感谢您的回复 felix,现在问题更清楚了。

标签: neo4j cypher graph-databases


【解决方案1】:

我们无法基于属性创建关系。您需要创建一个新关系并将类型(或关系名称)更改为您的数据标签名称。我使用 apoc 函数来更改(或更新)它。我做的是

  1. 查找附加到数据的所有节点和关系
  2. 创建所需的关系,但使用虚拟关系类型:REL
  3. 使用 apoc 函数 apoc.refactor.setType 将关系类型从 REL 更改为 c.label
  4. 不要忘记删除虚拟关系 REL
Match (a)-[:Input]->(c:Data)-[:Output]->(f)
CREATE (a)-[r:REL]->(f) 
WITH a, r, c, f
CALL apoc.refactor.setType(r, c.label)
YIELD input, output
WITH a, c, f 
MATCH (a)-[rel:REL]->(f) 
DELETE rel
RETURN a,  f  

之前:

之后:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多