如何将 edge/relationship 与包含该边信息的节点相关联?

How can I relate an edge/relationship to a node which contains information about that edge?

我必须将生物相互作用存储在 Neo4j 数据库中。例如,考虑一个场景,我有两种类型的节点,Protein & Experiment 和关系 INTERACTS_WITH。该关系以 (Protein)-[INTERACTS_WITH]-(Protein) 形式存在。现在,INTERACTS_WITH 也与 Experiment 相关,因为在该实验中观察到了这种生物相互作用。

我需要将 INTERACTS_WITH 关系与 Experiments 联系起来。

实现此目的的一种方法是将所有此类 Experiments 的 ID 存储在 INTERACTS_WITH 关系的数组类型 属性 中。但这就像在关系数据库中将一个实体的主键存储为另一个实体的外键一样,我想避免这种情况。

另一种方法是为每对相互作用的基因创建一个 Interaction 节点,然后将其与两个 ProteinsExperiments 相关联。但是只能在两个 Protein 节点之间进行交互,因此我必须以编程方式限制与 Interaction 节点相关的 Protein 节点的数量。这种方法也不好,因为 INTERACTS_WITH 实际上是一种关系,也许将其建模为节点并不是一个好主意。

有没有更好的图形方式来做到这一点?如果不是,以上两种方法哪个更好?

Another way can be to create an Interaction node for each pair of interacting genes and then relate it to the two Proteins and the Experiments.

我相信这是解决您问题的一个很好的方法。

But an interaction is possible between two Protein nodes only, so I will have to programmatically put a constraint on the number of Protein nodes that relate to an Interaction node.

无事可做。程序员总是这样做!例如:对于一对 Protein 节点之间存在多少 INTERACTS_WITH 关系,你有什么保证?可能你在创建的时候就关心它了。

This approach is also not good because INTERACTS_WITH is actually a relationship and perhaps it will be not a good idea to model it as a node.

想一想:如果您的 INTERACTS_WITH 关系需要与两个以上的节点相关,也许您正在将节点建模为关系,对吗?

提示:查看图建模 – 最佳实践和 Learning Neo4j(Rik Van Bruggen 着)一书的陷阱 和图形数据库一书(Ian Robinson、Jim Webber 和 Emil Eifrem 着)的 常见建模陷阱 部分.这很有启发性。您可以在 Neo4j 站点下载这两本书 here.