获取具有特定节点属性值的最新节点

时间:2019-01-29 09:20:07

标签: neo4j cypher graph-databases

我有一个架构,其中Product包含许多修订版ProductRevision,其中说明了产品处于哪种状态,并将其连接到特定的ProductParts配置,每个Part都有节点。每个Part可以在许多ProductParts中使用,每个ProductParts通常在三个修订版本中使用(状态NewTestedProduction)。如果更改了ProductParts,则会创建一个状态为New的新修订,并与上一个修订的上一个版本关联。

我还有诸如关系LATESTLATEST_NEWLATEST_TESTEDLATEST_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通过特定状态的最新修订版本进行连接,例如TestedProduction

我想使用快捷键关系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且具有特定状态,而不仅仅是最后一个。

如果我不返回prProduct失踪之间的ProductParts关系。

当我想要具有特定状态TestedProduction的最新修订时,存在任何方式来获得以下结果

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

1 个答案:

答案 0 :(得分:0)

您必须将请求分为两部分: -首先,获取您感兴趣的最新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

第一个MATCH通过将结果降序排列并仅保留第一个结果来获取最新的ProductRevision 第二个MATCH获取您需要的其余信息。