我正在尝试匹配具有特定标签的所有节点,这些节点没有任何关系或具有特定关系。类似这两个问题的结合:
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
答案 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上进行过滤。