用于多层次营销的Neo4j数据库建模

时间:2014-06-28 09:45:29

标签: neo4j modeling graph-databases

我正在尝试为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)

?这是我被困的地方。所以,在这里我需要建立一种关系[:购买] 每当代理商购买产品时,即使它是相同的产品?

在这种情况下,相同两个节点之间的相同类型和标签的多个关系是否有效?因为代理商可能会经常购买相同的产品,这将创造更大的号码。相同节点之间的多个关系。

此模型是否遵循标准建模原则? 任何人都可以建议更好的建模或修正吗?

2 个答案:

答案 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)产品。

一般而言,所有作为概念的概念或具有身份的概念都应建模为节点。