我正在开发Neo4j数据库,其中将包含癌症患者的基因组和临床数据。开发图形数据库时常见的设计问题是数据项应由节点表示还是由节点内的属性表示。就我而言,患者将进行数百项临床和人口统计测量(例如性别,药物,肿瘤大小)。这些数据中的某些数据将是恒定的(例如性别),而其他数据将随每次患者就诊而变化。我对先前的节点vs属性问题所见的回答建议使用对数据的预期查询来做出决定。我认为我可以确定一些属性,这些属性将成为常见的搜索条件,并且应该是节点(例如吸烟史,性别,癌症类型),但仍然给我留下了数百个其他属性。 Neo4j对节点应包含的属性数量有实际限制吗?而且,一种混合方法(其中一些数据是属性,而另一些是节点)似乎会使从源文件加载数据和后续查询变得更加复杂。
答案 0 :(得分:1)
“看看您的查询来决定”背后的主要思想是,数据如何相互关联会影响节点或属性是否更好。实际上,图形数据库的重点是使步行关系更易于查询。因此,您应该问自己的真正问题是:“(a)->()<-(b)有意义吗?”换句话说,我是否需要能够找到共享此属性的其他节点?
以下是一些快速的经验法则指南
节点
属性
标签
因此,让我们仔细考虑一下您的一些属性的思考过程...
性别
将是“ Male”或“ Female”,并且每个人都将连接到两者之一,因此它们最终都将成为超级节点(过载)。同样,如果最终您确实需要找到两个具有相同性别的人,那么几乎任何其他方法都比通过超级节点找到他们更有效。但是,这些是互斥的,不可变的遗传特征,因此使其成为标签也完全可以接受(有时是首选)。
地址
这是一个具有子属性的变量值,不会被很多节点共享,并且从一个人到另一个人在同一地址(或扩展为居住在一个区域)的步行具有重要意义。因此,这几乎绝对应该是一个节点。
身高和体重
这些随着时间不断变化,没有子值,两个共享此值的人几乎没有意义。值的范围太宽,因此Labels自此都不做,因此这应该是一个属性。
血液类型
虽然性爱比性别有更多选择,但所有关系都适用,只是关系现在很重要(因为人们必须共享血型才能捐赠)。问题在于此值将过载,您需要首先按面积过滤,而不仅仅是验证血型。可以是属性或标签。节点的情况是您在血液类型之间包含“ Can_Donate_To”或“ Can_Accept”关系。虽然您可能不会走这些关系来寻找潜在的捐赠者(因为它们太重了,您必须先按区域筛选),但是您可以使用它们来验证某人可以成为捐赠者。
社会保险号
高度敏感,有诉讼在等待发生。尽可能避免进入数据库。如果绝对必须;此属性是不可变的,但对每个人来说都是唯一的,因此,由于缺少重用,它是一个不好的标签,并且作为节点将毫无意义。绝对是财产。 (但如果仅用于验证目的,则应先加盐+散列)
母亲的娘家姓
可能的值是无限的,并且共享此值的两个节点没有实际意义。绝对是财产。
第一个孩子
由于子级已经是他们自己的节点,并且具有自己的子属性,因此只需在两者之间创建关系。尽管此信息的值值得怀疑,但任何时候您需要引用另一个节点时,请始终为其使用关系。绝对是一个节点。