У меня есть запрос на шифрование из Java (Spring Neo4j), который я использую, и он работает.
Основной запрос прост: он спрашивает, какие узлы ведут к другому узлу.
Суть проблемы заключается в том, что существует набор (из трех) элементов - contributor
, tag
и source
- по которому запросу может потребоваться отфильтровать его результаты.
Два из них - tag
и source
- приносят с собой отношения, которые необходимо проверить. Но если они не предоставлены, то эти отношения не нужно проверять.
Neo-браузер предупреждает меня о том, что используемый мной запрос будет неэффективным по вполне понятным причинам:
@Query("MATCH (p:BoardPosition)<-[:PARENT]-(n:BoardPosition)<-[:PARENT*0..]-(c:BoardPosition),
(t:Tag), (s:JosekiSource) WHERE
id(p)={TargetID} AND
({ContributorID} IS NULL or c.contributor = {ContributorID}) AND
({TagID} IS NULL or ((c)-->(t) AND id(t) = {TagID}) ) AND
({SourceID} IS NULL or ((c)-->(s) AND id(s) = {SourceID}) )
RETURN DISTINCT n"
)
List<BoardPosition> findFilteredVariations(@Param("TargetID") Long targetId,
@Param("ContributorID") Long contributorId,
@Param("TagID") Long tagId,
@Param("SourceID") Long sourceId);
(для ясности код из строки многострочного запроса Java удален из кода)
Казалось бы, это было бы более эффективно, если бы условное включение теста отношений могло быть в самом предложении MATCH. Но это не представляется возможным.
Есть ли какой-нибудь способ шифрования, которым я могу улучшить эффективность этого?
FWIW: предупреждение браузера Neo4j:
Этот запрос строит декартово произведение между несвязанными образцами.
Если часть запроса содержит несколько отключенных шаблонов, это
построит декартово произведение между всеми этими частями. Это может
создает большой объем данных и замедляет обработку запросов.