neo4j - 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;
解决方案
当布尔表达式中有多个存在子查询时,您似乎遇到了可能的 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;
推荐阅读
- php - 在订单视图列 WooCommerce 中显示自定义字段值
- java - 没有在 IntelliJ IDEA 中获取 lambda 表达式的断点选项
- tensorflow - TensorFlow 梯度 wrt 在 while_loop 主体内的中间结果
- c - C试图修复无限循环
- javascript - 用javascript读取一个孩子的孩子的内容
- python - Django:如何在模板中调用“包含”函数?
- javascript - 反应:setState 没有再次呈现页面
- python - 使用python将数据写入文件
- ios - iOS 内部 UITableViewCell 中的动态视图
- javascript - 如何在 html 的 onclick 方法中检测 tab 键?