У меня есть схема, в которой 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})