neo4j cypher:查询结果中的“堆叠”节点

时间:2014-03-10 22:55:03

标签: neo4j cypher

考虑到db中存在三种类型的节点,由模式连接

(a)-[ra {qty}]->(b)-[rb {qty}]->(c)

用户可以将他们中的一些列入他们的愿望清单或其他任何内容。

查询数据库以返回用户在其愿望清单上的所有节点的列表的最佳方式是什么,考虑到当他有一个(a)然后在结果中关联(b)在为相应的(c)b.price添加一些字段(例如c.pricera.qty)之后,还应该返回rb.qty吗?

注意:如果here

的变量长度不变,您可以找到相同的问题

1 个答案:

答案 0 :(得分:4)

假设您已将用户连接到他们想要的内容:

(user:User)-[:WANTS]->(part:Part)

这些部分与您描述的一样,依赖于特定数量的其他部分:

CREATE 
  (a:Part) -[:CONTAINS {qty:2}]->(b:Part),
  (a:Part) -[:CONTAINS {qty:3}]->(c:Part),
  (b:Part) -[:CONTAINS {qty:2}]->(c:Part)

然后你就可以找到所有部分,以及你需要的部分:

MATCH 
    (user:User {name:"Steven"})-[:WANTS]->(part),
    chain=(part)-[:CONTAINS*1..4]->(subcomponent:Part) 
RETURN subcomponent, sum( reduce( total=1, r IN relationships(chain) | total * r.rty) )

1..4术语表示在树下面查看1-4个子组件。你可以obv。将它设置为你喜欢的任何东西,包括" 1 ..",无限深度。

第二个词有点复杂。它有助于尝试查询而不需要总和来查看它的作用。如果没有这个,减少将为每个"链"提供所需部分的倍增。依赖性。然后,添加总和将按子组件(从RETURN子句推断)聚合结果,并总结该子组件的总计数。

然后计算出价格是一个乘以每个部分的总量的练习。我将此作为练习留给读者;)

您可以通过在http://console.neo4j.org/

在线控制台中运行查询来尝试此操作