Neo4j - 如何处理多维度的聚合

时间:2017-06-16 11:11:41

标签: neo4j cypher

我是Neo4j的新手,试图了解如何处理多维度的聚合。 例如,我有一个人 - 当他获得任务时,他会将产品交付到不同的城市。我将节点作为人员,产品和城市,并在它们之间建立关系(已交付产品和已交付产品)。我的数据如下所示

P1 - [delivered Products A1, A2 ] - [to City C1]
P1 - [delivered Products  A1 ] - [to City C2] 
P1 - [delivered Products A1, A2] - [to City C2] 

我的图表dbP1中存储了如下所示的聚合 - 交付3次产品A1

P1 - delivered 2 times Product A2 
P1 - delivered 1 time to city C1
P1 - delivered 2 times to city C2 

附图显示了上述连接。

Neo4j schema showing the above connections

现在我想知道P1人将产品A1送到城市C2的次数 [P1-A1-C2]或人P1将产品A1交付给城市C1 [P1-A1-C1]的次数 尝试使用产品和城市维度查看数据。

我们在Graph数据库中是否有任何设计模式来处理多维度的此类聚合,或者我们是否需要先将上述组合与图表数据库中的聚合一起存储?

1 个答案:

答案 0 :(得分:0)

我认为这里的主要问题是你的模型。由于您的图表中包含(Person)-[:DELIVERED]->(:Product)-[:TO]->(:City)这样的模型,因此无法知道哪些交付是针对特定城市的。 [DELIVERED {times : 3}]:Person之间的关系:Product无法帮助回答您向数据库提出的问题。

一种有用的好方法是在模型中添加一个名为:Delivery的新节点类型。这样您的图形将如下所示:

(:Person)-[:MADE]->(:Delivery)
(:Delivery)-[:TO]->(:City)
(:Delivery)-[:PRODUCT]->(:Product)

正如您所看到的,节点:Delivery:Person:City:Product

相关联
  

现在我想知道P1人将产品A1送到的次数   城市C2 [P1-A1-C2]或人P1交付产品A1的次数   城市C1 [P1-A1-C1]尝试使用产品和城市查看数据   尺寸。

我相信此查询将根据建议的模型回答您的问题:

MATCH (:Person {id:'P1'})-[:MADE]->(d:Delivery)-[:PRODUCT]->(:Product {id:'A1'}),
(d)-[:TO]->(:City {id:'C1'})
RETURN count(d)