Search code examples
cypherredisgraph

Can I rewrite this Cypher query to be compatible with Redis Graph?


My use-case is that I have some agents in organisation structure. I want select for some agent (can by me) to see sum (amount of money) of all contracts that that agents subordinates (and subordinates of their subordinates and so on...) created with clients grouped by contract category.

Problem is that Redis Graph do not currently support all predicate. But I need to filter relations between agents because we have multiple "modules" with different organisation structures and I need report just from one module at the time.

My current Cypher query is:

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

This query works in Neo4j.

I don't event know if this query is correctly written for the type of result that I want.

My boss would really like to use Redis Graph instead Neo4j because of performance reasons but I can't find any way to rewrite this query to be functional in the Redis graph. Is it even possible?

Edit 1: I was told that we will be using graph just for currently valid data and just for one module so I no longer need functional all predicate but I am still interested in answer.


Solution

  • The ALL function isn't supported at the moment, we do intend to add it in the near future, an awkward way of achieving the same effect as the ALL function would be a combination of UNWIND and 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
    ....