【问题标题】:Neo4J Cypher conditional where statement depending on parameterNeo4J Cypher 条件 where 语句取决于参数
【发布时间】:2020-02-18 12:33:20
【问题描述】:

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

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

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

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

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

这是我目前想出的:

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;

【问题讨论】:

    标签: neo4j cypher neo4j-apoc


    【解决方案1】:

    当布尔表达式中有多个 existential subqueries 时,您似乎遇到了可能的 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2018-05-02
      • 2015-10-10
      • 2021-03-10
      相关资源
      最近更新 更多