Neo4j Cypher:如果找到一个匹配项,如何停止检查多个 OPTIONAL MATCH 子句?

问题描述 投票:0回答:1

我试图检查是否存在任何一种关系组合,但我只关心是否至少存在一种。由于遍历的复杂性增加,如果我可以在第一次匹配时中断并返回查询,那就太理想了。

示例:

MATCH (p:Person { id: "user_1" }), (m:Movie { id: "movie_x" })
OPTIONAL MATCH (p)-[acted:ACTED_IN]->(m)
OPTIONAL MATCH (p)-[directed:DIRECTED]->(m)
OPTIONAL MATCH (p)-[:ACTED_IN]->(:Movie)<-[:PRODUCED_BY]-(:Studio)-[sibling_actor:PRODUCED_BY]->(m)
OPTIONAL MATCH (p)-[:DIRECTED]->(:Movie)-[:OF_TYPE]->(:Genre)<-[sibling_director:OF_TYPE]-(m)
RETURN count(acted) > 0 AS actedInMovie, count(directed) > 0 AS directedMovie, count(sibling_actor) > 0 AS actedInSibling, count(sibling_director) > 0 AS directedSibling

这将返回这些模式中每个模式存在的真实性,但由于我只关心是否有一个匹配,因此如果第一个找到匹配,我不想运行所有四个可选匹配。

neo4j cypher
1个回答
0
投票

要测试您要查找的模式是否存在,请使用 EXISTS 子查询:

MATCH (p:Person { id: "user_1" }), (m:Movie { id: "movie_x" })
RETURN 
  EXISTS { (p)-[acted:ACTED_IN]->(m) } OR
  EXISTS { (p)-[directed:DIRECTED]->(m) } OR
  EXISTS { (p)-[:ACTED_IN]->(:Movie)<-[:PRODUCED_BY]-(:Studio)-[sibling_actor:PRODUCED_BY]->(m) } OR
  EXISTS { (p)-[:DIRECTED]->(:Movie)-[:OF_TYPE]->(:Genre)<-[sibling_director:OF_TYPE]-(m) }
    AS hasRelationship

这将使用

SelectOrSemiApply
运算符进行规划,如果前一个子查询返回 false,则只会评估
EXISTS
子查询。

© www.soinside.com 2019 - 2024. All rights reserved.