【问题标题】:Cypher left outer join sql analogCypher 左外连接 sql 模拟
【发布时间】:2017-06-23 10:56:39
【问题描述】:

我正在尝试匹配所有具有特定标签但没有关系具有特定关系的节点。类似这样的两个查询组合:

MATCH (f:Field) 
OPTIONAL MATCH (f)--(t:Type) 
WHERE id(t) = {id} RETURN f
+
MATCH (f:Field) 
WHERE not (f)--(:Type) 
RETURN f

类似这样的:

MATCH (f:Field),(t:Type) 
WHERE id(t) = {id} 
AND NOT (f)--(:Type) 
OR (f)--(t)
RETURN f, id(t) 
ORDER BY id(t) 
LIMIT 10

但这永远不会以 150k 的 :Fields 执行

【问题讨论】:

    标签: database neo4j cypher


    【解决方案1】:

    类似这两个查询合并

    您可以简单地使用UNION。 UNION 文档说:

    UNION 子句用于组合多个查询的结果。

    试试看:

    MATCH (f:Field) OPTIONAL MATCH (f)--(t:Type) WHERE id(t) = {id} RETURN f
    UNION
    MATCH (f:Field) WHERE not (f)--(:Type) RETURN f
    

    或者您可以尝试将第二个 Cypher 查询更改为:

    // First match 't' where t.id = {id}
    MATCH (t:Type)
    WHERE id(t) = {id}
    // After match f when (f)--(t) or not (f)--(:Type)
    MATCH (f:Field)
    WHERE (f)--(t)
    OR
    NOT (f)--(:Type) 
    // return desired data
    RETURN f, id(t) ORDER BY id(t) LIMIT 10
    

    【讨论】:

      【解决方案2】:

      试试这样的:

      MATCH (f:Field)
      OPTIONAL MATCH (f)--(t:Type)
      WITH f, t
      WHERE t = null OR id(t) = {id} 
      RETURN f
      

      通过在 WITH 之后而不是在 OPTIONAL MATCH 之后使用 WHERE,我们允许它过滤我们需要的行,而不是过滤 OPTIONAL MATCH。

      【讨论】:

        猜你喜欢
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        相关资源
        最近更新 更多