如何将节点属性值分配给Cypher中的变量?

问题描述 投票:0回答:2

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

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

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

基本上,如何用Cypher完成这项工作?

免责声明:我们对Cypher很新 - 任何建议都值得赞赏。

我们已经尝试了一些更受限制的查询,但是在使用变量赋值时遇到了问题。

此查询为单个指定的“Concept”节点实现了所需的结果:

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

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

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

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

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
2个回答
2
投票

我很难理解你的问题,因为它以非标准的方式使用了一些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

0
投票

对于那些有相似要求的人来说,我们最终得到了以下查询,它让我们得到了我们所追求的结果:

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});

请注意,我们有<150个标有“Concept”的节点,并且“Name”字段包含我们用下划线替换的空格。

© www.soinside.com 2019 - 2024. All rights reserved.