Я пытаюсь написать запрос, который принимает четыре параметра, которые являются списками идентификаторов и которые должны фильтровать результаты.
У меня есть узлы под названием KnowledgeEntry, к которым прикреплено несколько KnowledgeRecords
(:KnowledgeEntry)-[:CONTAINS]->(:KnowledgeRecord)
Каждая запись KnowledgeRecords имеет четыре типа отношений с узлами типа Location, Community, Function или OrganizationalUnit, каждый из которых имеет атрибут id.
Я хочу получить все KnowledgeEntries, если у них есть одна или несколько KnowledgeRecords, которые иметь отношение к Location, Community, Function или 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 не имеет записей или является нулевым, оператор where следует игнорировать. Я попробовал это с оператором CASE и apo c .when, но безуспешно.
При добавлении оператора OR EXISTS, например, для OrganizationalUnit, я получаю сообщение об ошибке "Должно быть хотя бы одно выражение шаблона"
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;