【问题标题】:Neo4j 2.0.0-RC1 optional relations per relation removed?Neo4j 2.0.0-RC1 删除每个关系的可选关系?
【发布时间】:2013-11-24 14:07:03
【问题描述】:

在 Neo4j 2.0.0-M05 中我曾经这样做

START n=node(*) MATCH n-[r?]-() WHERE ID(n) <> 0 AND ID(n) <> 1 DELETE n, r

删除除节点 0 和 1 之外的整个数据库。现在在 Noe4j 2.0.0-RC1 中我不能再使用问号了。但相反,我必须像这样使用 OPTIONAL 关键字:

START n=node(*) OPTIONAL MATCH n-[r]-() WHERE ID(n) <> 0 AND ID(n) <> 1 DELETE n, r

问题 1

它匹配节点 1(查询时节点 0 不存在于数据库中)

neo4j-sh (?)$ START n=node(*) OPTIONAL MATCH n-[r]-() WHERE ID(n) <> 1 RETURN n, r;
+--------------------+
| n         | r      |
+--------------------+
| Node[1]{} | <null> |
+--------------------+

这当然不仅仅是这个查询的问题,而是在我需要使用类似查询的整个应用程序中。

问题 2

在我看来,这引入了一个严重的设计缺陷。也许我的推理在这里不成立,而且由于问题 1 我还不能测试它。但是OPTIONAL 关键字严重限制了进行查询的可能性。正如此处的公告中所述,http://blog.neo4j.org/2013/11/neo4j-200-rc1-final-preparations.html OPTIONAL 可以与OUTER JOIN 进行比较。为了跟上这种从节点到节点的类比跳跃就像添加一个额外的连接。

那么之前

MATCH (a)-[x]-(b)-[y?]-(c) RETURN a, b, c

会喜欢做

SELECT a, b, c FROM ??
INNER JOIN x ON ??
LEFT OUTER JOIN y ON ??

(问号到位,因为密码不转换为 SQL)
但不是使用 OPTIONAL 关键字,您可以创建所有连接 OUTER JOIN 或所有连接 INNER JOIN(没有可选关键字)。如果没有混合的内部/外部联接查询,我的应用程序将无法工作。对我来说,使关系可选PER HOP 是非常基本的。所以要么我必须留在M06(支持问号的最新版本),要么尝试另一个数据库。

签名,

绝望的开发者。

【问题讨论】:

    标签: database graph neo4j


    【解决方案1】:

    请提供一些示例数据和预期结果。我很确定你的两个查询可以用下面的可选匹配重写。

    您的 WHERE 子句行为怪异的原因是,直接在 OPTIONAL MATCH 之后的 WHERE 仅在 OPTIONAL MATCH 匹配某些内容时运行,作为该 OPTIONAL MATCH 的过滤器。所以在这种情况下,你会找到 n (id = 1),它不匹配 n-[r]-(),因为 n 没有关系,然后它返回 n。你需要先过滤你的 n,虽然我建议只使用 MATCH 而不是 START(在这种情况下没关系,但通常 MATCH 更好)。

    对于您的 #1,您需要改为执行此查询:

    MATCH (n)
    WHERE ID(n) <> 1   
    OPTIONAL MATCH n-[r]-() 
    RETURN n, r;
    

    对于你的 #2:

    MATCH (a)-[x]-(b)
    OPTIONAL MATCH (b)-[y]-(c)
    RETURN a, b, c // c will be null if it doesn't exist
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多