【问题标题】:How can I assign a node property value to a variable in Cypher?如何将节点属性值分配给 Cypher 中的变量?
【发布时间】:2019-04-12 00:29:12
【问题描述】:

我们正在尝试将具有特定标签(“概念”)的节点上的属性作为新标签传播到连接的节点(使用谓词“CONTAINS_OBJECT”),但正在努力将属性分配给查询中的变量.假设将有多个“概念”节点,假设没有“概念”节点与其他“概念”节点有重叠连接,如何做到这一点。

即以下情况永远不会发生,其中 n0 和 n1 不同:

(n0:Concept)-[:CONTAINS_OBJECT]->(o:Object)<-[:CONTAINS_OBJECT]-(n1:Concept)

基本上,Cypher 应该如何做到这一点?

免责声明:我们对 Cypher 还很陌生 - 感谢您提供任何和所有建议。

我们尝试了更多受限查询,但在变量分配中也遇到了问题。

此查询针对单个指定的“概念”节点实现了预期结果:

    MATCH p = (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(END)
    FOREACH (n in nodes(p) | SET n:Con0)

以下查询是我们尝试将“概念”节点的“名称”属性绑定到变量”,但在此实例中未分配“p”:

    MATCH p = (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(END)
    WITH c.Name as conceptName
    FOREACH (n in nodes(p) | SET n:conceptName)

为了尽可能简化我们所追求的结果,最终结果是对于任何给定的“概念”节点,以下两个 MATCH 语句应该返回相同的结果:

1)

    MATCH (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(o:Object)

2)

    MATCH (c:Concept{ Name: 'Con0' })-[:CONTAINS_OBJECT]->(o:Con0)

希望按照以下方式构建查询:

    MATCH p = (c:Concept)-[:CONTAINS_OBJECT]->(END)
    WITH c.Name as conceptName
    FOREACH (n in nodes(p) | SET n:conceptName)

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我很难理解您的问题,因为它以非标准方式使用了一些 neo4j 术语。例如,您的 Cypher 代码使用 CONTAINS_OBJECT 作为“关系类型” - 而不是“谓词”或“标签”。另一方面,它确实使用Concept 作为“标签”(仅适用于节点的术语)。

    如果您询问如何在特定节点之间复制标签,答案是您无法在 Cypher 语言本身中执行此操作(除非您事先知道可以使用的整个标签集)。这是因为原始 Cypher 语言不支持使用变量分配标签。

    但是,您可以调用 APOC 过程 apoc.create.addLabels(在安装 APOC 插件之后)将所有标签从一个节点复制到另一个节点。例如,此查询将所有标签从 c 节点复制到 obj 节点:

    MATCH (c:Concept)-[:CONTAINS_OBJECT]->(obj)
    CALL apoc.create.addLabels(obj, LABELS(c)) YIELD node
    RETURN node
    

    【讨论】:

    • 为术语混淆道歉 - 我们正在从 Triplestore/MSSQL 解决方案转移到 Neo4j,在系统细节方面的术语有一些额外的重叠。如果我们在正确的阶段将您的解决方案放入管道中,您的解决方案可能对我们非常有效,谢谢!
    【解决方案2】:

    对于任何来到这篇文章的有类似要求的人,我们最终来到了以下查询,它得到了我们想要的结果:

    call apoc.periodic.commit("MATCH (n:Concept)-[:CONTAINS_OBJECT]->(o:Object)
        WITH o, n, replace(n.Name, ' ', '_') as label limit {limit} call
        apoc.create.addLabels(o, [label]) yield node
        with node
        RETURN node",
    {limit:100000});
    

    请注意,我们有

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多