【问题标题】:Return nodes which do not have a property value in another node set返回在另一个节点集中没有属性值的节点
【发布时间】:2020-11-19 01:35:07
【问题描述】:

我对 Neo4j 还比较陌生,但无法在文档中找到我要查找的内容。我使用的是不支持子查询的 3.5 版。

我有两组节点,为简单起见,我将它们称为RocksBicycles。这些集合具有一些相似的属性,但没有关系并且它们是完全不同的——Rocks 中没有节点,而 Bicycles 中没有节点。但是,对于称为“颜色”的特定属性,它们可能具有相同的值。但是对于Rocks 中的节点,该属性拼写为color,对于Bicycles 中的节点,其拼写为colour

我想要返回Bicycles 中的所有节点,这些节点在Rocks 的任何节点中都没有colour 值。

这是我返回 Rocks 中所有节点颜色的查询:

MATCH (r:Rocks) WITH r.color AS excludecolors RETURN excludecolors

返回的正是我所期望的 - 颜色的十六进制值列表:["ff5733", "#0a8a00", "4f28ff", ...]

现在我想返回 Bicycles 中的所有颜色 EXCLUSIVE 我在 Rocks 的集合中找到的颜色

MATCH (r:Rocks) WITH r.color AS excludecolors RETURN excludecolors
MATCH (b:Bicycles) WHERE NOT b.colour IN [excludecolors] RETURN DISTINCT b.colour

但是,这会返回 Bicycles 中的所有内容 - 包括 excludecolors 中的颜色!我可以通过输入要排除的特定值来手动排除它们:

MATCH (b:Bicycles) WHERE NOT b.colour IN ["ff5733", "#0a8a00"] RETURN DISTINCT b.colour

但是有太多的事情需要手工完成。我怎样才能只返回在Bicycles 中找到的颜色,而不是在Rocks 中找到的颜色?我能想到的最接近的等价物是 SQL 外连接,但我对如何在 cypher 中做到这一点感到很困惑

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这应该可行:

    MATCH (r:Rocks)
    WITH COLLECT(DISTINCT r.color) AS excludeColors
    MATCH (b:Bicycles)
    WHERE NOT b.colour IN excludeColors
    RETURN DISTINCT b.colour
    

    【讨论】:

    • 这很完美! collect 是否强制输出为列表,而在我之前的列表中没有?
    • 是的。有关详细信息,请参阅aggregating functions 上的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多