【问题标题】:Cypher Query not returning nonexistent relationships密码查询不返回不存在的关系
【发布时间】:2016-06-03 09:25:24
【问题描述】:

我有一个图形数据库,其中有用户和兴趣节点,它们通过 IS_INTERESTED 关系连接。我想查找用户未选择的兴趣。我写了这个查询,但它不起作用

OPTIONAL MATCH (u:User{userId : 1})-[r:IS_INTERESTED] -(i:Interest)
WHERE r is NULL
Return i.name as interest

根据对 SO 上类似问题的回答(如this one),上述查询应该可以工作。但是,在这种情况下,它返回 null。但是当运行以下查询时,它会按预期工作:

MATCH (u:User{userId : 1}), (i:Interest)
WHERE NOT (u) -[:IS_INTERESTED] -(i)
return i.name as interest

我不想运行上述查询的原因是因为 Neo4j 给出了警告:

此查询在断开的模式之间构建笛卡尔积。

如果查询的一部分包含多个断开连接的模式,则此 将在所有这些部分之间建立一个笛卡尔积。这可能 产生大量数据并减慢查询处理速度。尽管 偶尔打算,通常可以重新制定 避免使用此叉积的查询,可能通过添加 不同部分之间的关​​系或使用 OPTIONAL MATCH (标识符是:(i))

在我使用 OPTIONAL MATCH 查找不存在的关系的第一个查询中我做错了什么?

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    1) MATCH 正在寻找整个模式,如果找不到它的整体 - 不返回任何内容。

    2)我认为这个查询会有效:

    // Take all user interests
    MATCH (u:User{userId: 1})-[r:IS_INTERESTED]-(i:Interest)
        WITH collect(i) as interests
        // Check what interests are not included
        MATCH (ni:Interest) WHERE NOT ni IN interests
    RETURN ni.name
    

    【讨论】:

      【解决方案2】:

      当您的 OPTIONAL MATCH 查询未找到匹配项时,ri 都必须是 NULL。毕竟既然没有关系,也就没有办法得到它所指向的节点。

      【讨论】:

      • 我明白了。那么有没有更好的方法(比使用我使用的第二个查询)来查找特定用户未选择的兴趣?
      • 我没有看到更好的方法。
      【解决方案3】:

      OPTIONAL MATCH 之后的 WHERE 被拉入评估。

      如果要进行后过滤,则必须在两者之间使用 WITH。

      MATCH (u:User{userId : 1})
      OPTIONAL MATCH (u)-[r:IS_INTERESTED] -(i:Interest)
      WITH r,i
      WHERE r is NULL
      Return i.name as interest
      

      【讨论】:

      • 我试过你的答案,它没有返回任何东西。它只是返回消息(没有变化,没有行)
      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 2019-04-21
      • 2021-06-30
      • 2020-11-12
      • 1970-01-01
      • 2020-02-16
      • 2013-03-29
      • 1970-01-01
      相关资源
      最近更新 更多