【问题标题】:Add Unique Nodes and relationship between them from Existing Setup in Neo4j从 Neo4j 中的现有设置添加唯一节点和它们之间的关系
【发布时间】:2014-12-31 19:20:56
【问题描述】:

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

Query case-specific nodes in Neo4j

所以情况如下图所示(请忍受蹩脚的图像)

蓝色链接表示 [:RELATES_TO] 关系,黑框中的数字表示 Length 属性的值。类似的值也存在于此处未显示的所有其他此类 [:RELATES_TO] 关系。

现在我想根据执行者节点的“名称”属性查找并创建独特的节点。继续链接中的示例,将只有 4 个新的唯一节点 [A,B,C,D]。让我们将它们称为 NewUniqueNodes,并将 name 作为属性

然后我想依次查询每个案例。在每种情况下,我都需要以 Length 属性的递增顺序 查询 [:RELATES_TO] 关系。对于任何这样的节点对 (x,y) 我需要添加一个关系 [:FINALRESULT{strength:0}] 从 NewUniqueNode(Name:x) 到 NewUniqueNode(name:y) 强度更新为 (strength + value)value 是与 [:RELATES_TO]value 属性关联的数字nodes(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)

在处理完整的案例集(case1 + case2 + case3)时,结果将类似于

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)

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    根据这个 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
    

    解释:

    • 首先,我们匹配所有执行者节点,并在 names 变量中收集不同的名称值。

    • 其次,我们使用 UNWIND 子句迭代名称,为名称集合中的每个名称创建一个 NewUniqueNode

    • 然后我们匹配所有案例,在每个案例中我们查找该案例中的 :RELATES_TO 关系,并按关系长度值对它们进行排序

    • 然后对于找到的每一个关系,我们匹配startNode名称值对应的NewUniqueNode,endNode名称值对应的NewUniqueNode也是如此

    • 1234563在 MERGE 上创建和匹配

    【讨论】:

    • 这不太符合要求,因为我需要“按大小写”遍历现有的图形设置,并且在每种情况下,按“长度”属性值的递增顺序。之所以如此,是因为每次更改时,我都需要向变量“正常”添加一个小数值,我已将其定义为包含值属性的节点,该属性会不断添加该更改。
    • 我更新了答案,如果它不符合您的要求,也许我遗漏了一些东西:)
    • 这确实符合要求。我必须承认,理解代码需要一些时间。谢谢。
    • 很高兴。对于未来,您能否创建一些 neo4j 控制台设置并发布问题链接,以便我们可以立即在您的模型上测试查询。谢谢!
    • :) 我添加了一些解释,可能对您或其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 2013-02-06
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多