这是此处定义的问题的继续
Query case-specific nodes in Neo4j
所以情况如下图所示(请留下蹩脚的图片)
蓝色链接表示 [:RELATES_TO] 与黑框中的数字的关系,表示 长度 属性的值。所有其他 [:RELATES_TO] 关系也存在类似的值,此处未显示。
现在我想 根据Performer Nodes的“Name”属性找到并创建唯一的节点 。继续链接中的示例,将只有4个新的唯一节点 [A,B,C,D] 。让我们将名称作为属性称为 NewUniqueNodes 。
然后我想依次查询每个案例。在每种情况下,我需要在 增加长度属性的顺序 中查询[:RELATES_TO]关系。对于任何这样的节点对(x,y),我需要从NewUniqueNode(Name:x)到NewUniqueNode(name:y)添加关系 [:FINALRESULT {strength:0}] 强度更新为(强度+ 值)。 值 是与 [:RELATES_TO] 的 值 属性相关联的数字一对节点(x,y)。
[示例和预期输出]
在case1中,访问节点的顺序为
Node(ID:3) to Node(ID:4)
Node(ID:1) to Node(ID:2)
Node(ID:1) to Node(ID:3)
在处理这些节点时,结果将是
NewUniqueNode(name:A)-[:FINALRESULT{strength: 1}]-NewUniqueNode(name:D)
NewUniqueNode(name:A)-[:FINALRESULT{strength: 1}]-NewUniqueNode(name:B)
NewUniqueNode(name:B)-[:FINALRESULT{strength: 1}]-NewUniqueNode(name:A)
在处理整套案例(案例1 + 案例2 + 案例3 )时,结果将类似于
NewUniqueNode(name:A)-[:FINALRESULT{strength: 1}]-NewUniqueNode(name:D)
NewUniqueNode(name:A)-[:FINALRESULT{strength: 3}]-NewUniqueNode(name:B)
NewUniqueNode(name:B)-[:FINALRESULT{strength: 2}]-NewUniqueNode(name:A)
NewUniqueNode(name:C)-[:FINALRESULT{strength: 1}]-NewUniqueNode(name:B)
NewUniqueNode(name:A)-[:FINALRESULT{strength: 1}]-NewUniqueNode(name:A)
答案 0 :(得分:2)
根据此Neo4j控制台设置,基于上一个问题http://console.neo4j.org/r/vci9yd 我有以下查询:
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
解释:
首先,我们匹配所有表演者节点,并在名称变量中收集不同的名称值。
其次,我们使用UNWIND子句迭代名称,为名称集合中的每个名称创建一个NewUniqueNode
然后我们匹配所有情况,在每种情况下我们都会寻找这种情况下的RELATES_TO关系,并按关系长度值排序
然后对于找到的每个关系,我们匹配对应于startNode名称值的NewUniqueNode,以及对应于endNode名称值的NewUniqueNode
最后我们合并了这两个唯一节点之间的:FINAL RESULT关系,然后我们根据:RELATES_TO关系长度值设置关系的strength属性,对于这部分,我猜你可以用ON做同样的事情。在MERGE上创建和搭配