Neo4j数据库建模和多层次营销

4
我正在尝试为Neo4j数据库建模一个图形数据库。以下是细节:
代理商-产品-等级-佣金。
将有代理商和产品(例如保健产品)。
代理商会在另一个代理商下加入或直接加入。 代理商只能有一个父代理商,但可以有多个子代理商。 加入代理商的广度和深度没有限制。
代理商将得到提升,其等级取决于他们购买的产品的总价值。 代理商每月获得佣金,这取决于他们和他们的子代理商在一个月内购买的产品的总价值。
节点: 代理商 {名称,年龄,...,等级} A1,A2,A3...
节点: 产品 {名称,描述,...,价格} P1,P2,P3...
关系: 购买 {日期,时间,数量,总支付} (代理商) -[:purchases]-> (产品)
代理商可以同时购买多种产品。 代理商可以多次购买同一种产品。
例如:
A1 {'John Doe','34',...,'4'} P1 {'Px1','desx1',...,'$2.3'} A1 - [:purchases {03-01-2014,09.30,02,'$4.6'}]-> (P1) A1 - [:purchases {07-01-2014,13.45,01,'$2.3'}]-> (P1)
?这就是我被卡住的地方。所以,我需要每次代理商购买产品时都创建一个关系[:purchases],即使是同一种产品吗?
在此场景中,在同两个节点之间具有相同类型和标签的多个关系是否高效?因为代理商可能会经常购买相同的产品,这将在相同的节点之间创建更多的多个关系。
这种模型遵循标准建模原则吗? 是否有人可以提出更好的建模或纠正?
2个回答

7
正如Stefan所建议的那样,我会引入与产品有关系并且在该节点中存储购买价值的“购买”节点。这样,您就可以将查询限制在购买上,而无需进一步查找产品。
(:Agent)-[:made]->(:Purchase {date: XXX, value: XXX})-[:HAS]->(:Product)

假设我们有一个关系:WORKS_FOR来将子代理与其父代理联系起来:
(a1:Agent)-[:WORKS_FOR]->(a2:Agent)

这个简单的查询将为您提供每个代理商自己完成的购买总和,而不考虑他的下属。
MATCH (parent:Agent)-[:MADE]->(p:Purchase) RETURN parent.name, sum(p.value)

现在,如果你还想考虑代理商子女的购买情况,你可以这样做:
MATCH (parent:Agent)-[:MADE]->(p:Purchase) WITH parent, sum(p.value) AS own_value OPTIONAL MATCH (parent)<-[:WORKS_FOR*]-(child:Agent)-[:MADE]->(pc:Purchase) RETURN parent.name, own_value + sum(pc.value) as total_value

4
我猜你经常需要计算特定代理A和产品P之间所有购买的总和。如果是这样,引入一个“total_purchases”关系可能会很有益,它在A和P之间保持总和。每当添加新的购买时,请确保更新现有的“total_purchases”关系。
另一件要考虑的事情是,当前具有“purchases”关系的方法是否隐藏了某些领域概念。我可以想到代理商下多个订单的情况。每个订单包含多个商品 - 这就是您目前使用“purchases”关系进行引用的内容。因此,订单将是一个节点,其中包含日期等信息,连接到1)代理和2)产品。
总的来说,任何作为独立概念或具有身份的东西都应该被建模为一个节点。

@ Stefan:在代理商和产品之间引入订单节点将是有效的。这消除了为同一订单的每个产品购买插入日期和时间的需要,而可以将日期和时间作为节点订单的属性包含在内。 - deus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接