Neo4J Сайфер условно где оператор в зависимости от параметра - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь написать запрос, который принимает четыре параметра, которые являются списками идентификаторов и которые должны фильтровать результаты.

У меня есть узлы под названием 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;

1 Ответ

0 голосов
/ 18 февраля 2020

Возможно, вы столкнулись с возможной ошибкой 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...