实施“珠子式”'在Neo4j的连接

时间:2015-04-10 15:39:27

标签: neo4j cypher graph-databases

我是Neo4j的新手,但看起来只能在它们的起点和终点节点之间建立关系,而中间没有任何其他节点。换句话说,我不能通过C'从A到B创建一种关系,只有' A到C,C到B'代替。

现在说我们有以下节点类型(或Neo4j术语中的标签):买方,产品,测量单位。如果用例是这样的话,如何构建图表给我这个买家在购买该产品时使用的测量单位'?

自然,这种关系是这样的:

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

但是在这个模型中,我们无法分辨出所测量的产品(所有买家)所测量的单位实际上是由我们感兴趣的买家使用的。我们只能跟踪买家到产品,然后在我们将产品追溯到我们忘记的单位。买方,只能获得每个买家订购该产品所使用的所有单位。

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

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

然而,这看起来非常难看,因为逻辑单元应该是节点(并且在其他用例中它们是节点便利)。在这里,我们必须将它们复制为关系属性,因为没有办法告诉这种关系从买方节点开始,经过产品节点而不会中断测量单元节点的结束。

我的问题是,是否有更好的方法为类似的查询设计图表,并且如果在处理图形数据库时可能不认为这种级别的数据重复是丑陋的。或者也许我有这样的用例意味着图形是一个错误的工具?

1 个答案:

答案 0 :(得分:1)

通常,当您遇到交叉关系的需要时,会显示建模问题。

我无法记住任何电子商务,例如没有订单专用域模型的应用程序,可能是neo4j或其他持久层。订单是您的域的重要组成部分,然后将拥有其专用节点。

订单与产品之间的关系将代表普通电子商务应用程序中所谓的订单行项目,该订单行项目可将该单位保留为财产。