Могу ли я переписать этот запрос Cypher для совместимости с Redis Graph? - PullRequest
1 голос
/ 29 мая 2020

Мой вариант использования состоит в том, что у меня есть несколько агентов в организационной структуре. Я хочу выбрать для какого-нибудь агента ( могу я ), чтобы увидеть сумму ( сумма денег ) всех контрактов, которые подчиненные агенты ( и подчиненные) их подчиненных и так далее ... ), созданных с клиентами, сгруппированными по категориям контрактов.

Проблема в том, что Redis Graph в настоящее время не поддерживает предикат all. Но мне нужно фильтровать отношения между агентами, потому что у нас есть несколько «модулей» с разными организационными структурами, и мне нужен отчет только по одному модулю за раз.

Мой текущий запрос Cypher:

MATCH path = (:agent {id: 482})<-[:supervised *]-(b:agent)
    WHERE all(rel IN relationships(path) WHERE
        rel.module_id = 1
        AND rel.valid_from < '2020-05-29'
        AND '2020-05-29' < rel.valid_to)
WITH b as mediators
MATCH (mediators)-[:mediated]->(c:contract)
    RETURN
        c.category as category,
        count(c) as contract_count,
        sum(c.sum) as sum
    ORDER BY sum DESC, category

Этот запрос работает в Neo4j.

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

Мой босс действительно хотел бы использовать Redis Graph вместо Neo4j из-за соображений производительности, но я не могу найти способ переписать этот запрос, чтобы он работал в графе Redis. Возможно ли это вообще?

Edit 1: Мне сказали, что мы будем использовать график только для текущих достоверных данных и только для одного модуля, поэтому мне больше не нужен функциональный предикат all, но Я все еще интересуюсь ответом.

1 Ответ

3 голосов
/ 11 июня 2020

Функция ALL в настоящий момент не поддерживается, мы намерены добавить ее в ближайшем будущем, неудобным способом достижения того же эффекта, что и функция ALL, была бы комбинация UNWIND и count

MATCH path = (:agent {id: 482})<-[:supervised *]-(b:agent)
WITH b AS b, relationships(path) AS edges, size(relationships(path)) AS edge_count
UNWIND edges AS r
WITH b AS b, edge_count AS edge_count, r AS r
WHERE r.module_id = 1 AND r.valid_from < '2020-05-29' AND '2020-05-29' < r.valid_to
WITH b AS b, edge_count AS edge_count, count(r) AS filter_edge_count
WHERE edge_count = filter_edge_count
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...