从Neo4j中的Existing Setup添加唯一节点及它们之间的关系

时间:2014-12-31 19:20:56

标签: neo4j cypher

这是此处定义的问题的继续

Query case-specific nodes in Neo4j

所以情况如下图所示(请留下蹩脚的图片) enter image description here

蓝色链接表示 [: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)

1 个答案:

答案 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上创建和搭配