图建模布尔值 - 关系 属性,或节点 属性 或 none?
Graph Modeling boolean value - relationship property, or node property or none at all?
上下文
一家企业有很多合作伙伴。每个合作伙伴都可以为其客户提供多种服务。一些合作伙伴提供所有服务,一些提供一些服务。企业始终可以向该合作伙伴销售产品,并且可以销售哪种产品取决于合作伙伴是否提供特定服务。因此,企业可以将产品 A 出售给提供服务 A 的合作伙伴 A。如果他们不提供服务 B,他们可以向合作伙伴 A 提供产品 B。
问题 - 如果合作伙伴、产品、服务是节点,我应该在哪里建模问题“此合作伙伴是否提供此服务?”另一个业务问题是 "Whats my market for Product A?" - 应该 return 所有不提供使用产品 A 构建的服务的合作伙伴。
我应该怎么做:
Partner_OFFERS_Service_BUILT_WITH_Product
(只有
Partner_Service 提供=是的关系)。在这种情况下,如何
我 return 可以出售产品以提供服务的合作伙伴
他们还没有报价?
Partner_COULD-OFFER_Service_BUILT_WITH_Product
,并且有
Offered=yes/no 作为 属性 COULD_OFFER
关系
Partner_COULD-OFFER_Service_BUILT_WITH_Product
,并且有
Offered=yes/no 作为节点 Service
上的 属性。 EDIT:This 行不通,因为我不能为每个合作伙伴都提供这个 属性。
- 有 2 种不同的关系 -
OFFERS
和
DOESNT_OFFER
至
将每个合作伙伴与每个服务相关联,然后有一个机制来切换
收养发生变化时的关系。
这将是 Spring Java 应用程序的后端。我知道这可以通过多种方式完成,并试图从查询和编码的角度理解最简单的方法。
编辑 与用户讨论后,需求变得更加复杂。他们实际上做的是关系世界中的 table 和以下列
(它用大量重复数据进行了非规范化:
PartnerName | Service | Offered? |CurrentlyUsing | WeCouldSellThese |
XX | Baking | Yes |Competitor A, B | Product A |
XX | Baking | Yes |Competitor A, B | Product C |
XX | Baking | Yes |Competitor A, B | Product D |
XX | OnlyDough| Yes |Product A | Product C |
XX | Packing | No | | Product E |
基本上,他们需要存储当前正在使用的信息,以及
无论它目前是否由合作伙伴提供,他们仍然会尝试向他们出售产品(提供是或否仍然会导致市场)。服务和产品之间也存在多对多关系……这意味着存在“3node”关系——潜在客户被定义为针对特定服务的特定产品的特定合作伙伴,
我尝试了以下模型,但不确定如何同时查询 Could_Buy 和 To_Build,当单个产品上存在多个这些关系时。
最适合您的最简单的设计是创建以下关系:
节点(合作伙伴)- [OFFERS] -> 节点(服务)
节点(服务)- [BUILT_WITH] -> 节点(服务)
示例:合作伙伴 A - 报价 - 服务 A、产品 A - BUILT_WITH - 服务 A、产品 B - BUILT_WITH - 服务 B
现在如何回答您的业务问题:
Is this Service offered by this Partner?
:这很简单。您只需要检查服务和合作伙伴之间是否存在 'OFFERS' 关系。
What's my market for Product A?
:您可以获取所有服务 'BUILT_WITH' 产品 A。(即服务 A)。接下来,获取与 ServiceA 不存在 'OFFERS' 关系的所有合作伙伴节点。
很确定,单个查询可以帮助在 Neo4j 中实现此结果。
上下文
一家企业有很多合作伙伴。每个合作伙伴都可以为其客户提供多种服务。一些合作伙伴提供所有服务,一些提供一些服务。企业始终可以向该合作伙伴销售产品,并且可以销售哪种产品取决于合作伙伴是否提供特定服务。因此,企业可以将产品 A 出售给提供服务 A 的合作伙伴 A。如果他们不提供服务 B,他们可以向合作伙伴 A 提供产品 B。
问题 - 如果合作伙伴、产品、服务是节点,我应该在哪里建模问题“此合作伙伴是否提供此服务?”另一个业务问题是 "Whats my market for Product A?" - 应该 return 所有不提供使用产品 A 构建的服务的合作伙伴。 我应该怎么做:
Partner_OFFERS_Service_BUILT_WITH_Product
(只有 Partner_Service 提供=是的关系)。在这种情况下,如何 我 return 可以出售产品以提供服务的合作伙伴 他们还没有报价?Partner_COULD-OFFER_Service_BUILT_WITH_Product
,并且有 Offered=yes/no 作为 属性COULD_OFFER
关系Partner_COULD-OFFER_Service_BUILT_WITH_Product
,并且有 Offered=yes/no 作为节点Service
上的 属性。 EDIT:This 行不通,因为我不能为每个合作伙伴都提供这个 属性。- 有 2 种不同的关系 -
OFFERS
和DOESNT_OFFER
至 将每个合作伙伴与每个服务相关联,然后有一个机制来切换 收养发生变化时的关系。
这将是 Spring Java 应用程序的后端。我知道这可以通过多种方式完成,并试图从查询和编码的角度理解最简单的方法。
编辑 与用户讨论后,需求变得更加复杂。他们实际上做的是关系世界中的 table 和以下列 (它用大量重复数据进行了非规范化:
PartnerName | Service | Offered? |CurrentlyUsing | WeCouldSellThese |
XX | Baking | Yes |Competitor A, B | Product A |
XX | Baking | Yes |Competitor A, B | Product C |
XX | Baking | Yes |Competitor A, B | Product D |
XX | OnlyDough| Yes |Product A | Product C |
XX | Packing | No | | Product E |
基本上,他们需要存储当前正在使用的信息,以及
无论它目前是否由合作伙伴提供,他们仍然会尝试向他们出售产品(提供是或否仍然会导致市场)。服务和产品之间也存在多对多关系……这意味着存在“3node”关系——潜在客户被定义为针对特定服务的特定产品的特定合作伙伴,
我尝试了以下模型,但不确定如何同时查询 Could_Buy 和 To_Build,当单个产品上存在多个这些关系时。
最适合您的最简单的设计是创建以下关系:
节点(合作伙伴)- [OFFERS] -> 节点(服务)
节点(服务)- [BUILT_WITH] -> 节点(服务)
示例:合作伙伴 A - 报价 - 服务 A、产品 A - BUILT_WITH - 服务 A、产品 B - BUILT_WITH - 服务 B
现在如何回答您的业务问题:
Is this Service offered by this Partner?
:这很简单。您只需要检查服务和合作伙伴之间是否存在 'OFFERS' 关系。What's my market for Product A?
:您可以获取所有服务 'BUILT_WITH' 产品 A。(即服务 A)。接下来,获取与 ServiceA 不存在 'OFFERS' 关系的所有合作伙伴节点。 很确定,单个查询可以帮助在 Neo4j 中实现此结果。