我正在尝试为neo4j数据库建模图形数据库。这是详细信息:
代理商 - 产品 - 排名 - 佣金。
会有代理商。 会有产品(比如健康产品)。
代理商将加入另一个代理商或可以直接加入。 代理只能有一个父代但只有多个子代。 在其他代理商下加入代理商的广度和深度没有限制。
代理商将被提升,等级取决于他们购买的产品的总价值。 代理商按月支付佣金,这取决于他们和他们的孩子在一个月内购买的产品的总价值。
节点:代理{name,age,...,rank} A1,A2,A3 ......
节点:产品{名称,描述,...,价格} P1,P2,P3 ......
关系:购买{日期,时间,数量,总薪酬}
(代理人) - [:购买] - > (产品)
代理商可以一次购买多个产品。 代理商可以多次购买相同的产品。
示例:
A1 {'John Doe','34',...,'4'}
P1 {'Px1','desx1',...,'$ 2.3'}
A1 - [:purchase {03-01-2014,09.30,02,'$ 4.6'}] - > (P1)
A1 - [:purchase {07-01-2014,13.45,01,'$ 2.3'}] - > (P1)
?这是我被困的地方。所以,在这里我需要建立一种关系[:购买] 每当代理商购买产品时,即使它是相同的产品?
在这种情况下,相同两个节点之间的相同类型和标签的多个关系是否有效?因为代理商可能会经常购买相同的产品,这将创造更大的号码。相同节点之间的多个关系。
此模型是否遵循标准建模原则? 任何人都可以建议更好的建模或修正吗?
答案 0 :(得分:5)
正如Stefan建议的那样,我将介绍与产品有关系的Purchase
个节点,并将购买价值存储在该节点中。这样,您可以将查询限制为购买,而无需深入了解产品。
(: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
答案 1 :(得分:3)
我猜您经常需要计算特定代理商A和产品P之间所有购买的总和。如果是这样,在A和P之间引入一个total_purchases
关系并保持总和可能是有益的。每当您添加新购买时,请务必更新现有的total_purchases
关系。
另一件需要考虑的事情是,当前拥有purchases
关系的方法是否隐藏了某些域概念。我可以想到代理商下了多个订单。每个订单包含多个项目 - 这是您当前使用purchases
关系引用的项目。所以订单将是一个节点,例如日期连接到1)代理商和2)产品。
一般而言,所有作为概念的概念或具有身份的概念都应建模为节点。