首页 > 解决方案 > Neo4J Cypher 条件 where 语句取决于参数

问题描述

我正在尝试编写一个带有四个参数的查询,这些参数都是 id 列表并且应该过滤结果。

我有名为 KnowledgeEntry 的节点,其中附加了多个 KnowledgeRecords

(:KnowledgeEntry)-[:CONTAINS]->(:KnowledgeRecord)

每个 KnowledgeRecords 都有四种与 Location、Community、Function 或 OrganizationalUnit 类型的节点的关系,它们都具有 id 属性。

如果所有 KnowledgeEntries 具有一个或多个与位置、社区、功能或 OU 相关的 KnowledgeRecords,其中 id 与给定列表(参数)中的一项匹配,我想检索所有 KnowledgeEntries

到目前为止,这是我想出的:

MATCH (knowledgeEntry:KnowledgeEntry)-[relationship]-(:KnowledgeEntry)
WHERE EXISTS {
    MATCH (knowledgeEntry)-[:CONTAINS]->(:KnowledgeRecord)-[:BASED_AT]->(loc:Location)
    WHERE loc.id IN $filters.locationIds
}

RETURN relationship, knowledgeEntry;

这仅在设置了所有使用的参数时才有效。例如,如果 $filters.locationIds 没有条目或为 null,则应忽略 where 语句。我用 CASE 语句和 apoc.when 尝试了这个,但没有成功。

当为组织单位添加 OR EXISTS 时,我收到一个错误“应该至少有一个模式表达式”

MATCH (knowledgeEntry:KnowledgeEntry)-[relationship]-(:KnowledgeEntry)
WHERE EXISTS {
    MATCH (knowledgeEntry)-[:CONTAINS]->(:KnowledgeRecord)-[:BASED_AT]->(loc:Location)
    WHERE loc.id IN $locationIds
}

OR EXISTS {
    MATCH (knowledgeEntry)-[:CONTAINS]->(:KnowledgeRecord)-[:RELEVANT_FOR_EMPLOYEES_WITH]->(ou:OrganizationalUnit)
    WHERE ou.id IN $organizationalUnitIds
}

RETURN relationship, knowledgeEntry;

标签: neo4jcypherneo4j-apoc

解决方案


当布尔表达式中有多个存在子查询时,您似乎遇到了可能的 neo4j 错误。

此查询结合了您的两个子查询,可能更适合您:

MATCH (knowledgeEntry:KnowledgeEntry)-[relationship]-(:KnowledgeEntry)
WHERE EXISTS {
  MATCH (knowledgeEntry)-[:CONTAINS]->(:KnowledgeRecord)-[:BASED_AT|RELEVANT_FOR_EMPLOYEES_WITH]->(x)
  WHERE
    (x:OrganizationalUnit AND x.id IN $organizationalUnitIds) OR
    (x:Location AND x.id IN $locationIds)
}
RETURN relationship, knowledgeEntry;

推荐阅读