图数据库边缘可以有多个起始节点吗?

时间:2014-06-16 03:16:14

标签: graph neo4j hypergraph nosql

我正在为资格规则设计图表数据库。某些资格规则要求用户选择2种特定产品(产品A和产品B)才有资格获得产品C.

是否可以创建具有2个起始节点的图形边缘?

我认为这会打破我认为图形数据库的基本构建块 - 它的邻接列表。但如果这是可能的,那对我的应用程序来说会非常强大。

更新6/16

更具体地说,我希望创建一个有2个起始节点和1个结束节点的有向边。因此,在商业规则术语中:IF节点= A AND节点= B THEN节点= C.现实世界的关系是:如果客户购买产品A和产品B,那么客户就有资格获得产品C.

2 个答案:

答案 0 :(得分:1)

通常,为了在Neo4j中建模超图,你最终会创建一个中间的"组节点"连接所有要连接的节点,然后将该节点桥接到另一个节点。它不是真正的超图,而是使用提供的工具表示超图。

以下是一个例子: http://www.markhneedham.com/blog/2013/10/22/neo4j-modelling-hyper-edges-in-a-property-graph/

答案 1 :(得分:0)

是的,您可以在Neo4j中拥有多个起始节点,不确定其他图形数据库。

START a=node(0), b=node(1)
RETURN a,b

您应该参考http://docs.neo4j.org/chunked/stable/query-start.html了解更多详情。从Neo4j 2.0开始节点开始是可选的,Cypher将尝试根据label和where子句推断查询的起点。

修改

我根据更新的问题编辑了答案。你需要的是hypergraph。正如Wes Freeman所提到的,要建模超图Neo4j,您需要创建一个连接其他两个节点和第三个节点的中间节点。在您的场景中,用户将与两个产品(A和B)具有PURCHASED关系,如(:User {Id: 1})-[:PURCHASED]->(:Product {Name:A})。然后你将不得不创建一个像ProductQualifier这样的中间节点(我很擅长命名)与(:User {Id:1})-[:QUALIFIES]->(:ProductQualifier {Id:1})之类的用户建立关系。然后,Product限定符将有3个关系,分别为Product A和B的两个,第三个为Product C,

  

(:Product {Name:'B'})< - [:HAS] - (:ProductQualifier {Id:1}) - [:HAS] - >(:Product {Name:'A'})

     

(ProductQualifier {Id:1} - [:可参加] - >(:产品{名称:'C'})

这应该做你想要的。

您可以采用的第二种方法是使用一个本质上支持超图的数据库,例如Hypergraphdb,从而减​​轻了创建额外节点的负担。我没有任何机会使用它虽然我想尝试它已经有一段时间了,所以我不太了解它的API或它的局限性,但它是相当熟知的图形数据库。

注意:如上所述,我在命名方面非常糟糕。您应该更改标签名称以更适合您的商业模式。