Получить последний узел с определенным значением свойства узла - PullRequest
0 голосов
/ 29 января 2019

У меня есть схема, в которой Product содержит множество ревизий ProductRevision, в которых указано, в каком состоянии находится продукт, и он связан с определенной ProductParts конфигурацией с узлами для каждого Part.Каждый Part может использоваться во многих ProductParts, а каждый ProductParts обычно используется в трех ревизиях (статус New, Tested и Production).Если ProductParts изменяется, новая ревизия создается со статусом New и связана с предыдущими ревизиями предыдущих версий.

У меня есть также ярлыки, такие как отношения LATEST, LATEST_NEW, LATEST_TESTED и LATEST_PRODUCTION, которые соединяют Product напрямую с последним узлом ревизии, последним узлом ревизии в статусе New и т. Д.

Команда для создания простого примера находится здесь

CREATE (p:Product {Name:"Test1"})-[:REVISION {Created:datetime()}]-> 
(pr1:ProductRevision {Status:"New", Created:datetime()})-[:USING]->(pp:ProductParts)
CREATE (pp)-[:CONTAINS]->(p1:Part {Id:1})
CREATE (pp)-[:CONTAINS]->(p2:Part {Id:2})
CREATE (pr1)-[:REVISION {Created:datetime()}]->(pr2:ProductRevision {Status:"Tested", Created:datetime()})-[:USING]->(pp)
CREATE (pr2)-[:REVISION {Created:datetime()}]->(pr3:ProductRevision {Status:"Production", Created:datetime()})-[:USING]->(pp)
CREATE (ppChanged:ProductParts)
CREATE (ppChanged)-[:USING]->(p1)
CREATE (ppChanged)-[:USING]->(p3:Part {Id:3})
CREATE (pr3)-[:REVISION {Created:datetime()}]->(pr4:ProductRevision {Status:"New", Created:datetime()})-[:USING]->(ppChanged)
CREATE (pr4)-[:REVISION {Created:datetime()}]->(pr5:ProductRevision {Status:"Tested", Created:datetime()})-[:USING]->(ppChanged)
CREATE (p)-[:LATEST {Created:datetime()}]->(pr5)
CREATE (p)-[:LATEST_NEW {Created:datetime()}]->(pr4)
CREATE (p)-[:LATEST_TESTED {Created:datetime()}]->(pr5)
CREATE (p)-[:LATEST_PRODUCTION {Created:datetime()}]->(pr3)

Так иМне нужно получить цепочку наподобие (Product)-(ProductParts)-(Part), где ProductParts подключено через последнюю ревизию в определенном состоянии, например, Tested или Production.

Я хотел использовать отношения ярлыков LATEST_*, но это не такне работает, как я ожидал.Я пробовал запрос как

MATCH (p:Product)-[:LATEST_TESTED|LATEST_PRODUCTION]-(pr:ProductRevision)--(pp:ProductParts)--(pa:Part)
WITH *, max(pr.Created) as prc
RETURN p,pr,prc,pp,pa

, но он возвращает все ProductParts с определенным статусом, а не только последний.

Если я не возвращаю pr отношение между Product иProductParts отсутствует.

Существует любой способ получения следующего результата, когда я хочу последнюю версию с определенным статусом Tested или Production

(:Product {Name: "Test"}) --> (:ProductRevision {Status:"Tested"}) --> (:ProductParts) --> (:Part {Id:1})
.                                                                                      \-> (:Part {Id:3})

1 Ответ

0 голосов
/ 29 января 2019

Вы должны разделить ваш запрос на две части: - во-первых, получить самую последнюю ProductRevision, которая вас интересует; - во-вторых, получить все ProductParts и детали, связанные с ProductRevision

MATCH (p:Product)-[:LATEST_TESTED|LATEST_PRODUCTION]-(pr:ProductRevision)
WITH p, pr
ORDER BY pr.Created DESC
LIMIT 1
MATCH (pr)--(pp:ProductParts)--(pa:Part)
RETURN p, pr, pp, pa
* 1006.* Первый MATCH получает последний ProductRevision, упорядочивая результаты по убыванию и сохраняя только первый результат. Второй MATCH получает остальную информацию, которая вам нужна.
...