0

我正在为资格规则设计一个图形数据库。一些资格规则要求用户选择 2 个特定产品(产品 A 和产品 B)才能获得产品 C 的资格。

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

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

更新 6/16

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

4

2 回答 2

1

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

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

于 2014-06-16T04:05:14.967 回答
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 将尝试根据标签和 where 子句从您的查询中推断起始点。

编辑

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

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

(ProductQualifier {Id:1}-[:ELIGIBLE]->(:Product {Name: 'C'})

这应该做你想要的。

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

注意:如前所述,我非常不擅长命名事物。您可能应该将标签名称更改为更适合您的业务模型。

于 2014-06-16T03:56:15.277 回答