Neo4j 数据建模:指定语句来源的正确方法?

问题描述 投票:0回答:1

我正在开发一个科学数据库,其中包含模型语句,例如:

“纤维肌痛的一个可能原因是小胶质细胞过度活跃,这 10 项研究支持:[...],但 1 项研究与之相矛盾 [...]。”

我需要在 Neo4j 中指定语句的来源,并且能够执行两种方式的操作,例如:

  • 查找研究支持的所有陈述
  • 查找支持某个陈述的所有研究

我最直接的想法是使用研究的 DOI 作为关系属性中的唯一标识符。这个想法的最大缺点是我必须扫描所有关系才能找到研究支持的所有陈述的列表。

因此,由于不可能在研究和关系之间建立联系,因此我想到在关系的两端建立两个链接。明显的缺点是它没有提供有关关系的信息,例如“支持”或“矛盾”。

所以,我得出的结论是我需要一个节点来进行假设:

但是,它使图过载,我们不再采用经典的节点-关系->节点设计,这种设计使属性图变得如此易于理解。

使用 RDF,可以使用子图向关系添加属性,但是我们输入语义图和四元存储,这是一个更复杂的工具。

所以我想知道 Neo4j 是否有一个“正确”的设计模式来支持这种我可能没有想象到的需求?

neo4j rdf graph-databases knowledge-graph
1个回答
1
投票

根据您的要求,我认为将 support_study 作为 Edge 的属性即可完成工作:

因此我们可以查询以下内容:

查找研究支持的所有陈述

MATCH ()-[e:has_cause{support_study: "doi_foo_bar"}]->()
RETURN e;

查找支持某个陈述的所有研究

给出的陈述是“foo”是由“bar”引起的

MATCH (v:disease{name: "foo"})-[e:has_cause]->(v1:sympton{name: "bar")
RETURN DISTINCT e.support_study;

同时,这主要基于NebulaGraph,其中:

  • 它使用 cypher DQL(与 nGQL 一起)
  • 支持边缘属性
  • 它使用4元组(而不是Key)来区分边缘(src,dst,edge_type,rank),其中
    rank
    是一种独特的设计,可以在一对疾病->症状之间启用多个
    has_cause
    边缘实例,你可以将 doi 或其他数字的哈希值作为排名字段(或省略,因为它会是 0)
  • 它是分布式和开源的(Apache 2.0)

注意: 在NebulaGraph中,应该在has_cause(support_study)和disease(name)上创建索引,参考:https://www.siwei.io/en/nebula-index-explained/https://docs.nebula- graph.io/3.2.0/3.ngql-guide/14.native-index-statements/

但是,我认为它也适用于 Neo4j :)

© www.soinside.com 2019 - 2024. All rights reserved.