在使用Neo4j Cypher返回之前过滤结果进行查询

时间:2017-05-31 02:29:28

标签: neo4j cypher resultset

我有一个可以返回潜在大量行的查询。尽可能快地至关重要。

有没有办法根据匹配的内容更改返回的内容?以下是查询的简化版本:

MATCH p=(x)-[*]->(y) WHERE x.n="a"
WITH p,y OPTIONAL MATCH (y)<-[]-(z)
RETURN DISTINCT p,z

如果OPTIONAL MATCH找到了结果,那么就不需要大集合&#39; p&#39;被退回。

我想对结果做些什么:

IF z has results THEN RETURN z ELSE RETURN p

谢谢!

2 个答案:

答案 0 :(得分:1)

此查询应该有效(它基本上产生两种结果):

MATCH p=(x)-[*]->(y) WHERE x.n="a"
OPTIONAL MATCH (y)<--(z)
RETURN DISTINCT
  CASE WHEN z IS NULL THEN {p: p} ELSE {z: z} END AS res;

请注意,如果你有大量数据,像[*]这样的无界模式可能需要很长时间(或永远不会完成,或内存不足)。

答案 1 :(得分:0)

您可以使用coalesce()功能。它将返回传递给它的表达式列表中的第一个非null值。尝试:

MATCH p=(x)-[*]->(y) WHERE x.n="a"
WITH p,y
OPTIONAL MATCH (y)<-[]-(z)
WITH coalesce(z, p) as result
RETURN DISTINCT result