图建模布尔值 - 关系 属性,或节点 属性 或 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 构建的服务的合作伙伴。 我应该怎么做:

  1. Partner_OFFERS_Service_BUILT_WITH_Product(只有 Partner_Service 提供=是的关系)。在这种情况下,如何 我 return 可以出售产品以提供服务的合作伙伴 他们还没有报价?
  2. Partner_COULD-OFFER_Service_BUILT_WITH_Product,并且有 Offered=yes/no 作为 属性 COULD_OFFER 关系
  3. Partner_COULD-OFFER_Service_BUILT_WITH_Product,并且有 Offered=yes/no 作为节点 Service 上的 属性。 EDIT:This 行不通,因为我不能为每个合作伙伴都提供这个 属性。
  4. 有 2 种不同的关系 - OFFERSDOESNT_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,当单个产品上存在多个这些关系时。

最适合您的最简单的设计是创建以下关系:

  1. 节点(合作伙伴)- [OFFERS] -> 节点(服务)

  2. 节点(服务)- [BUILT_WITH] -> 节点(服务)

    示例:合作伙伴 A - 报价 - 服务 A、产品 A - BUILT_WITH - 服务 A、产品 B - BUILT_WITH - 服务 B

现在如何回答您的业务问题:

  1. Is this Service offered by this Partner? :这很简单。您只需要检查服务和合作伙伴之间是否存在 'OFFERS' 关系。
  2. What's my market for Product A?:您可以获取所有服务 'BUILT_WITH' 产品 A。(即服务 A)。接下来,获取与 ServiceA 不存在 'OFFERS' 关系的所有合作伙伴节点。 很确定,单个查询可以帮助在 Neo4j 中实现此结果。