提供了示例数据库的初始设置 link to console
有多种情况,每种情况下都有表演者(具有属性 id 和 name)。这是定义的问题的延续problem statement和 solution to unique node creation
第二个链接中的解决方案是( credits to Christophe Willemsen )
MATCH (n:Performer)
WITH collect(DISTINCT (n.name)) AS names
UNWIND names as name
MERGE (nn:NewUniqueNode {name:name})
WITH names
MATCH (c:Case)
MATCH (p1)-[r:RELATES_TO]->(p2)<-[:RELATES]-(c)-[:RELATES]->(p1)
WITH r
ORDER BY r.length
MATCH (nn1:NewUniqueNode {name:startNode(r).name})
MATCH (nn2:NewUniqueNode {name:endNode(r).name})
MERGE (nn1)-[rf:FINAL_RESULT]->(nn2)
SET rf.strength = CASE WHEN rf.strength IS NULL THEN r.value ELSE rf.strength + r.value END
该解决方案达到了要求。
但我需要实现这样的目标。
foreach (Case.id in the database)
{
foreach(distinct value of r.Length)
{
//update value property of node normal
normal.value=normal.value+0.5^(r.Length-2)
//create new nodes and add the result as their relationship or merge it to existing one
MATCH (nn1:NewUniqueNode {name:startNode(r).name})
MATCH (nn2:NewUniqueNode {name:endNode(r).name})
MERGE (nn1)-[rf:FINAL_RESULT]->(nn2)
//
rf.strength=rf.strength + r.value*0.5^(r.Length-2);
}
}
问题是跟踪 case 以及 r.Length 属性中的更改。在Cypher中如何实现?
最佳答案
我不会重做最后一部分,即设置优势的部分。
有一件事是,在您的控制台链接中,只有一个 Normal 节点,那么为什么您需要迭代每种情况,您只需匹配不同的关系长度即可。
顺便说一下第一部分:
MATCH (n:Case)
MATCH (n)-[:RELATES]->()-[r:RELATES_TO]->()<-[:RELATES]-(n)
WITH collect(DISTINCT (r.length)) AS lengths
MATCH (normal:Normal)
UNWIND lengths AS l
SET normal.value = normal.value +(0.5^l)
RETURN normal.value
说明:
匹配案例
对于每个案例,匹配该案例的执行者的 RELATES_TO 关系
收集不同的长度
匹配Normal节点,迭代不同长度集合并在Normal节点上设置适当的值
关于neo4j - 跟踪 Neo4j 中的更改 - 在标准编程中实现诸如 "flag"变量之类的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27782300/