Объединение двух подзапросов с Cypher в Neo4J - PullRequest
0 голосов
/ 28 января 2020

У меня следующий запрос SQL:

SELECT q1.customerId, q1.invoiceId, q2.workId, sum(q2.price)
FROM (select customer.id as customerId, invoice.id as invoiceId, work.id as workId from customer, invoice, workinvoice, work where customer.id=invoice.customerid and invoice.id=workinvoice.invoiceId and workinvoice.workId=work.id
) as q1, (select work.id as workId, sum((price * hours * workhours.discount) + (purchaseprice * amount * useditem.discount)) as price from worktype,workhours,work,warehouseitem,useditem where worktype.id=workhours.worktypeid and workhours.workid=work.id and work.id=useditem.workid and useditem.warehouseitemid=warehouseitem.id group by work.id
) as q2
WHERE q1.workId = q2.workId group by q1.invoiceId;

Этот запрос должен возвращать мне сумму цен на работы для каждого счета на одного клиента.

Мне было бы интересно узнать, как выполнить такой запрос в Neo4J. Я знаю, что есть UNION https://neo4j.com/docs/cypher-manual/current/clauses/union/. Однако, похоже, это делает то, что я хочу. Мне нужно сделать два подзапроса и соединить их с того же узла, что и в этом примере SQL. Как правильно сделать это с Сайфером?

Ответы [ 2 ]

1 голос
/ 28 января 2020

Есть довольно сложный пример того, как сделать объединение в шифре, который вы можете найти здесь: https://github.com/moxious/halin/blob/master/src/api/data/queries/dbms/3.5/tasks.js#L22

В основном, техника заключается в том, что вы запускаете первый запрос, собирать результаты. Затем вы запускаете второй, собираете результаты. Затем вы раскручиваете второе, сопоставляете с помощью фильтра и возвращаете результат.

В действительно упрощенной форме это выглядит примерно так:

CALL something() YIELD a, b
WITH collect({ a: a, b: b }) as resultSet1
CALL somethingElse YIELD a, c
WITH resultSet1, collect({ a: a, c: c }) as resultSet2

UNWIND resultSet2 as rec
WITH [item in resultSet1 WHERE item.a = rec.a][0] as match, rec

RETURN match.a, match.b, rec.c

Бит понимания списка в основном выполняет соединение. Здесь мы присоединяемся к полю «а».

0 голосов
/ 06 марта 2020

Я нашел решение, которое хотел:

MATCH (inv: invoice) - [: WORK_INVOICE] -> (w: work) <- [h: WORKHOURS] - (wt: worktype) WITH inv , w, SUM (вес. цена * h.hours * h.discount) как workTimePrice ДОПОЛНИТЕЛЬНОЕ МАТЧ (w) - [u: USED_ITEM] -> (i: item) WITH inv, workTimePrice + SUM (u.amount * u. скидка * i.purchaseprice) как workItemPrice ВОЗВРАТ инв, сумма (workItemPrice) как invoicePrice

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...