【问题标题】:Neo4j: Node versus Node propertyNeo4j:节点与节点属性
【发布时间】:2018-09-17 14:20:46
【问题描述】:

我正在开发一个 Neo4j 数据库,其中将包含癌症患者的基因组和临床数据。开发图形数据库的一个常见设计问题是数据项应该由节点表示还是由节点内的属性表示。就我而言,患者将接受数百项临床和人口统计测量(例如性别、药物、肿瘤大小)。其中一些数据将是恒定的(例如性别),而其他数据将随着每次患者就诊而变化。我看到的对先前节点与属性问题的响应建议使用针对数据的预期查询来做出决定。我想我可以识别出一些属性,这些属性将是常见的搜索条件并且应该是节点(例如吸烟史、性别、癌症类型),但这仍然给我留下了数百个其他属性。 Neo4j 中节点应包含的属性数量是否有实际限制?此外,一种混合​​方法(其中一些数据是属性,另一些是节点)似乎会使从源文件加载数据和后续查询更加复杂。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    “查看查询以决定”背后的主要思想是,数据之间的相互关系会影响节点或属性是否更好。确实,图数据库的主要目的是使步行关系更易于查询。所以你应该问自己的真正问题是“(a)-->()

    这里有一些快速的经验指南

    节点

    • 有自己的子值或关系
    • 多个节点共享这个值是有意义的,你需要能够在它们之间沿着这个共享值走
    • 很少更改
    • 如果可以同时应用多个值

    属性

    • 可能的值范围很广
    • 随时间变化
    • 如果可以应用多个值,则通常将值作为一组更新(而不是单独更新)

    标签

    • 具有小范围的互斥值
    • 几乎从不改变

    让我们来看看你的一些属性的思考过程......

    将是“男性”或“女性”,每个人都将连接到两者之一,因此他们最终都会成为超级节点(过载)。另外,如果你最终需要找到两个同性的人,几乎任何其他方法都比通过超级节点找到他们更有效。然而,这些是相互排斥、不可变的遗传特征,因此将其作为标签也是完全可以接受的(有时是首选)。

    地址

    这是一个具有子属性的变量值,不会被很多节点共享,并且从一个人到另一个人在同一地址(或者,通过扩展,居住在一个区域)具有有价值的意义。所以这几乎肯定是一个节点。

    身高和体重

    这些随着时间不断变化,没有子价值,两个人分享这个价值几乎没有意义。值的范围太宽了,所以标签也没有,所以这应该是一个属性。

    血型

    虽然有比 Sex 更多的选择,但所有相同的逻辑都适用,只是关系现在很重要(因为人们必须共享一种血型才能捐献)。问题是这个值太重了,你需要先过滤区域,而不仅仅是验证血型。可以是属性或标签。节点的情况是,如果您在血型之间包含“Can_Donate_To”或“Can_Accept”关系。虽然您可能不会通过这些关系来寻找潜在的捐赠者(因为它们过于繁重,并且您必须先按区域过滤),但您可以使用它们来验证某人是否可以成为捐赠者。

    社会安全号码

    高度敏感,等待发生的诉讼。尽可能远离数据库。如果你必须这样做;这个属性是不可变的,但是对每个人来说都是唯一的,所以由于缺乏重用,是一个不好的标签,作为一个节点将毫无意义。绝对是财产。 (但如果仅用于验证目的,则应加盐+散列)

    母亲的娘家姓

    可能的值是无穷无尽的,共享这个值的两个节点没有实际意义。绝对是财产。

    第一个孩子

    由于孩子已经是自己的节点,具有自己的子属性,只需在两者之间建立关系。尽管此信息的价值值得怀疑,但任何时候您需要引用另一个节点时,请始终为其使用关系。绝对是一个节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多