【问题标题】:Neo4j/Cypher - SET node if a different node fulfills certain conditionNeo4j/Cypher - 如果不同的节点满足特定条件,则设置节点
【发布时间】:2017-03-25 23:46:25
【问题描述】:

如果另一个节点满足特定条件,我如何使用SET 更改节点?

伪代码示例:

MATCH (node1{myId:123456}) // the node which should be compared
RETURN
CASE
WHEN node1.name = "foo" // if condition is fulfilled
THEN MATCH (node2{myId:654321}) SET node2.name = "bar" // the node which i want to edit)
END

我不能使用MERGE 或简单的MATCH (...) SET (...),因为'评估节点'!='应该被操纵的节点'。 CASE 表达式似乎也不起作用。 我也尝试了FOREACH-CASE hack 的方法,显然没有任何成功。

请注意,我的用例暗示,所涉及的两个节点确实已经存在(并且是唯一的)。
有什么建议吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    首先,您需要在匹配项上使用标签,否则匹配项不会利用索引。

    您可以仅使用 MATCH(或 OPTIONAL MATCH)和 WHERE(在此处添加替代标签)来解决比较问题。

    MATCH (node1:Node{myId:123456}) 
    MATCH (node2:Node{myId:654321}) 
    WHERE node1.name = "foo" 
    SET node2.name = "bar"
    

    WHERE 子句仅适用于前面的 MATCH、OPTIONAL MATCH 或 WITH 子句。

    如果 node1 的名称不是 'foo',则在 WHERE 子句执行后,上述查询将没有结果行,因此 SET 操作不会有任何更改。

    如果这是一个较大查询的片段,并且无论条件如何,您都有想要执行的操作,请改用 OPTIONAL MATCH。它将保留结果行,但如果 node1 的名称不是 'foo',则 node2 将为 null,因此 SET 操作仍然不会改变任何内容。

    【讨论】:

    • 呃,我现在感觉有点傻。不管怎么说,还是要谢谢你! PS:这是一个简化的例子,所以我省略了标签。
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多