我们正尝试将具有特定标签(“概念”)的节点上的属性作为新标签传播到连接的节点(带有谓词“ 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)
答案 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个带有“概念”标签的节点,并且“名称”字段包含我们用下划线替换的空格。