我有一个架构,其中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})
答案 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
获取您需要的其余信息。