在 Neo4j 中实现 'beads-style' 个连接

Implementation of 'beads-style' connections in Neo4j

我是 Neo4j 的新手,但看起来只有它们的开始和结束节点之间才有可能存在关系,中间没有任何其他节点。换句话说,我无法创建关系 'from A to B via C',只能创建 'A to C, C to B'。

现在假设我们有以下节点类型(或 Neo4j 术语中的标签):买家、产品、测量单位。如果用例是 'give me measuring units this buyer used when buying that product'?

如何构建图表

关系自然是这样的:

(:buyer)-[:ordered]->(:product)-[:measured]->(:unit)

但在这个模型中,我们无法判断(所有买家)曾测量过产品的哪些单位被我们感兴趣的买家实际使用过。我们只能追踪买家到产品,然后在什么时候使用我们将产品追踪到我们 'forget' 买家的单位,并且只能获得每个订购该产品的买家使用的所有单位。

我现在实施的方式是我的 :ordered 从买家到产品的关系带有 属性 'unit',因此我可以进行如下查询:

MATCH (b:buyer)-[o:ordered]->(p:product) WHERE b.id = 123 AND p.id = 345 RETURN DISTINCT o.unit

然而,这看起来非常丑陋,因为逻辑上单元应该是节点(并且在其他用例中它们是节点很方便)。相反,在这里,我们必须将它们复制为关系属性,因为无法告诉 'this relationship starts at the buyer node, goes through product node and without interrupting ends at measuring unit node'.

我的问题是,是否有更好的方法来为类似的查询设计图形,以及在处理图形数据库时,这种级别的数据重复是否不被认为是丑陋的。或者我有这样的用例的事实意味着图形是不适合这项工作的工具?

通常,当您遇到交叉关系的需要时,就会表现出建模问题。

我不记得有任何电子商务应用程序没有专门的订单域模型,将是 neo4j 或其他持久层。订单是您域的重要组成部分,然后会有其专用节点。

订单和产品之间的关系表示常见电子商务应用程序中所谓的订单行项目,可以将单位保存为 属性。