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

时间:2019-04-12 00:29:12

标签: neo4j cypher

我们正尝试将具有特定标签(“概念”)的节点上的属性作为新标签传播到连接的节点(带有谓词“ CONTAINS_OBJECT”),但正在努力将属性分配给查询中的变量。假设没有多个“ Concept”节点与其他“ Concept”节点具有重叠的连接,怎么办呢?

即在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)

为简化结果,我们将尽力而为,最终结果是对于任何给定的“ Concept”节点,以下两个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)

2 个答案:

答案 0 :(得分:2)

我很难理解您的问题,因为它以非标准的方式使用了一些neo4j术语。例如,您的Cypher代码使用const alwaysThrows = () => { throw new Error("OH NOES"); }; const iterate = (integer) => { console.log(integer); return integer + 1; }; const prom = Promise.resolve(iterate(1)); prom .then((value) => iterate(value)) .then(iterate) .then(iterate) .then(iterate) .then(alwaysThrows) .then(iterate) .then(iterate) .then(iterate) .catch(e => console.log(e.message)); 作为“关系类型”,而不是“谓词”或“标签”。另一方面,它确实使用CONTAINS_OBJECT作为“标签”(仅适用于节点的术语)。

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

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

obj

答案 1 :(得分: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个带有“概念”标签的节点,并且“名称”字段包含我们用下划线替换的空格。