【问题标题】:How can I relate an edge/relationship to a node which contains information about that edge?如何将边缘/关系与包含有关该边缘的信息的节点相关联?
【发布时间】:2017-06-09 19:49:18
【问题描述】:

我必须将生物相互作用存储在 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 实际上是一种关系,将其建模为节点可能不是一个好主意。

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

【问题讨论】:

  • 我提议 (i:Interaction)
  • 要确保交互中只有 2 个蛋白质,请相信您的 UI。此外,您可以进行批量查询,并对创建交互的用户做出反应(报告、电子邮件)(前提是您存储了它)

标签: neo4j cypher data-modeling graph-databases


【解决方案1】:

另一种方法是为每一对创建一个交互节点 相互作用的基因,然后将其与两种蛋白质和 实验。

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

但是只有两个蛋白质节点之间才有可能进行交互,所以我 将不得不以编程方式限制 与交互节点相关的蛋白质节点。

没有什么可做的。程序员一直在做!例如:对于一对蛋白质节点之间存在多少个 INTERACTS_WITH 关系,您有什么保证?可能您在创建时就关心它。

这种方法也不好,因为 INTERACTS_WITH 实际上是 关系,也许将其建模为 节点。

想一想:如果您的INTERACTS_WITH 关系需要与两个以上的节点相关联,那么您可能正在将一个节点建模为一个关系,对吧?

提示:查看图形建模 - 最佳实践和 《Learning Neo4j》一书(Rik Van Bruggen)和《图形数据库》一书(Ian Robinson、Jim Webber 和 Emil Eifrem)的 Common Modeling Pitfalls 部分中的陷阱。这可能很有启发性。可以在 Neo4j 网站here下载这两本书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多