Neo4J Cypher条件where语句取决于参数

时间:2020-02-18 12:33:20

标签: neo4j cypher neo4j-apoc

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

我有一个称为KnowledgeEntry的节点,上面附加了多个KnowledgeRecords

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

KnowledgeRecords每个与位置,社区,功能或OrganizationalUnit类型的节点都有四种类型的关系,它们都具有id属性。

如果它们具有一个或多个与位置,社区,功能或OU相关的知识记录,并且ID与给定列表(参数)中的一项匹配,我想检索所有知识记录。

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

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尝试过此操作,但没有成功。

在为OrganizationalUnit添加OR ORISTS时,出现错误“应该至少有一个模式表达式”

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;

1 个答案:

答案 0 :(得分:0)

当布尔表达式中有多个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;
相关问题