在连接的节点上查找特定关系的 属性

Finding a specific relationship's property on a connected node

我的示例图的创建代码是:

CREATE (a:Product { name:"A" }),(b:Product { name:"B" }),(c:Product { name:"C" }),(d:Product { name:"D" }),(e:Product { name:"E" }),(f:Product { name:"F" }),(s1:Supplier { name:"s1" }),(s2:Supplier { name:"s2" }),(s3:Supplier { name:"s3" }),(c)-[:Parent]->(b),(b)-[:Parent]->(a),(f)-[:Parent]->(d),(e)-[:Parent]->(d),(d)-[:Parent]->(a),(s1)-[:PRICE { value:10 }]->(a),(s2)-[:PRICE { value:20 }]->(c),(s3)-[:PRICE { value:30 }]->(d)

示例图的图片:

想法是 E 和 F "inherit" 价格来自 D 的 PRICE 关系,C 的价格来自其直接传入的 PRICE 关系,B 继承自 A。不用说,生产图随着变化而更深价格水平 "inheritance"。实际上,一种产品可能有多个价格(多个供应商),但那是以后的事。 现在,我想创建一个查询,为每个产品生成价目表。

我的密码查询的问题是使价格继承变得通用,因为价格可能来自距离任意数量的父跃点的节点。

欢迎提出任何建议。

编辑:澄清一下:价格仅从具有传入 PRICE 关系的第一个父级继承。因此,例如,E 和 F 仅从 D 获取价格。

编辑编号 2:

感谢所有回复。妮可,当我回到 post 我的答案时,我现在才看到你的答案,所以我将其添加为编辑而不是答案,并将你的标记为原始问题的答案,因为我认为你的答案是最接近我最终想出的。

我从这个问题中学到的一件事 post 并不是要将问题简单化太多,我确实暗示了很多供应商的部分,但应该把它放在中心位置。

除此之外,我想 post 我想出的解决方案。

创建新图表的代码

CREATE (a:Product { name:"A" }),(b:Product { name:"B" }),(c:Product { name:"C" }),(d:Product { name:"D" }),(e:Product { name:"E" }),(f:Product { name:"F" }),(s1:Supplier { name:"s1" }),(s2:Supplier { name:"s2" }),(s3:Supplier { name:"s3" }),(c)-[:Parent]->(b),(b)-[:Parent]->(a),(f)-[:Parent]->(d),(e)-[:Parent]->(d),(d)-[:Parent]->(a),(s1)-[:PRICE { value:10 }]->(a),(s2)-[:PRICE { value:20 }]->(c),(s3)-[:PRICE { value:30 }]->(d),(s3)-[:PRICE{value:40}]->(f)

为产品 F 添加了供应商 S3 的另一个 PRICE 报价。价目表包含通过关系为产品明确规定的价格或从父产品继承的价格,但仅继承任何给定产品的第一个价格供应商。所以在新图中 F 得到价格 直接来自 S3,不继承 S3 对 D 的价格,但会继续并从 A 继承 S1 的价格。

我目前正在处理的查询如下:

MATCH
path = ((product)-[:Parent*0..]->(parentProduct)<-[price:PRICE]-(supplier:Supplier))
where single ( code in nodes(path) where (code)<-[:PRICE]-(supplier) )
with product,parentProduct,price,supplier
order by price.value
with product.name as ProductName, collect([supplier.name,price.value]) as PriceList
order by ProductName
return ProductName,PriceList

给出以下价目表:

您可以尝试这样的操作:

match (s:Supplier)-[p:PRICE]->(prod:Product)<-[:parent*]-(other:Product)
where not (other)<-[:PRICE]-(s2:Supplier)
RETURN prod, other, p;

这会尝试构建与产品相关的所有价格的列表,跟随具有相同价格的父链接 returns other 产品。 where 子句保证由 :parent 关系链接的其他产品没有自己的本地价格。

怎么样

MATCH path=(p:Product)-[:Parent*0..]->(parent)<-[:PRICE]-(s)
WITH path,head(nodes(path)) as product
WITH product,min(length(path)) as size,collect(path) as allPaths 
UNWIND allPaths as path
WITH product,size,path,length(path) as length
WHERE size=length
RETURN product,last(relationships(path)).value;

这会匹配从产品到供应商的路径,确定到链中第一个供应商的最短路径,然后根据该长度进行过滤。

我会这样做:

MATCH path = (p:Product)-[:Parent*0..]->(:Product)<-[r:PRICE]-(:Supplier)
WITH p, LENGTH(path) AS len, r.value AS prices
ORDER BY p.name, len
RETURN p.name AS product, HEAD(COLLECT(prices)) AS price
ORDER BY product

结果:

product price
      A    10
      B    10
      C    20
      D    30
      E    30
      F    30

这从一个 Product 节点开始,并遵循 Parent 关系到最近的具有传入 PRICE 关系的 Product。请注意,*0.. 处理具有直接传入 PRICE 关系的 Products。对于每个产品,路径按长度升序排列,您可以从最短路径获得价格。

看这里:http://console.neo4j.org/r/ovhajx