Cypher左外连接sql模拟

时间:2017-06-23 10:56:40

标签: database neo4j cypher

我正在尝试匹配具有特定标签的所有节点,这些节点没有任何关系具有特定关系。类似这两个问题的结合:

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的:Field s

执行

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

尝试这样的事情:

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上进行过滤。