【发布时间】: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(支持问号的最新版本),要么尝试另一个数据库。
签名,
绝望的开发者。
【问题讨论】: