具有查询Neo4j的比较运算符

时间:2016-10-21 06:53:06

标签: neo4j query-optimization query-performance

我需要获取两个标签之间是否存在关系以及其中一个标签上基于条件的数据的数据。我在以下找到了答案:

MATCH (n:Label1) 
WHERE NOT (n)-[:REL_1]-(:Label2) 
OR (n)-[:REL_1]-(e:Label2 {id:1}) 
RETURN count(DISTINCT(n))

但我需要的是所有id>=5数据都应该出现在结果

如果我执行像::

这样的查询
MATCH (n:Label1) 
WHERE NOT (n)-[:REL_1]-(:Label2) 
OR (n)-[:REL_1]-(e:Label2) 
WHERE e.id >= 5 
RETURN count(DISTINCT(n))

产生错误::

Invalid input 'H': expected 'i/I' (line 1, column 94 (offset: 93)) 

2 个答案:

答案 0 :(得分:3)

[增订]

Cypher查询连续不能包含2个WHERE子句。此外,您尚未定义e标识符。

此查询应该有效(我假设您只想计算n,如果它没有这种关系,或者如果它至少有一个e.id至少为5):

MATCH (n:Label1)
OPTIONAL MATCH (n)-[:REL_1]-(e:Label2)
WITH n, e
WHERE e IS NULL OR e.id >= 5
RETURN count(DISTINCT n);

答案 1 :(得分:0)

你可以嵌套WHERE过滤器,你只需要放弃语法糖就可以了。

MATCH (n:Label1)
WHERE ALL(p IN (n) - [:REL_1] - (:Label2) WHERE LAST(NODES(p))['id'] >= 5)
RETURN COUNT(n)

您可以使用ANYALLNONE工具集重新构建您可以梦寐以求的任何匹配过滤器构造,它允许您在内部应用过滤器并嵌套可迭代组件(在IN和`WHERE之间)到多个深度。