Neo4j:节点与节点属性

3
我正在开发一个Neo4j数据库,其中包含癌症患者的基因组和临床数据。在开发图形数据库时,常见的设计问题是数据项应该由节点还是节点内的属性表示。在我的情况下,患者将有数百个临床和人口统计学测量值(例如性别、药物、肿瘤大小)。其中一些数据将是恒定的(例如性别),而其他数据将随每次患者访问而变化。对于先前关于节点与属性的问题,我看到的回答建议使用预期的查询来做出决策。我认为我可以确定一些常见的搜索标准并将其作为节点(例如吸烟史、性别、癌症类型),但这仍然留下了数百个其他属性。在Neo4j中,节点应包含的属性数量是否存在实际限制?此外,混合方法,其中某些数据是属性,而其他数据是节点,似乎会使从源文件加载数据和随后的查询变得更加复杂。
1个回答

5
“看待查询结果以决定使用哪种节点或属性”这个概念的主要思想是数据之间的关系如何影响节点或属性的选择。实际上,图形数据库的主要目的是使遍历关系更容易进行查询。因此,你应该问自己的真正问题是:“(a) ->()<-(b)是否具有重要意义?”换句话说,我需要能够找到共享此属性的其他节点吗?
以下是一些快速的经验法则:
节点
- 拥有自己的子值或关系 - 具有此值的多个节点具有含义,并且您需要能够在它们之间沿着共享的值进行遍历 - 变化不频繁 - 如果同时可以应用多个值
属性
- 具有大范围的可能值 - 随时间变化 - 如果可以应用多个值,则通常作为集合更新值(而不是单独更新)
标签
- 具有小型有限的互斥值范围 - 几乎从不改变
让我们来看看您的一些属性的思考过程...
性别
将是“男性”或“女性”,每个人都将连接到其中之一,因此它们都将成为超级节点(过载)。此外,如果您确实需要找到共享相同性别的两个人,则几乎任何其他方法都比通过超级节点找到它们更有效。但是,这些是相互排斥的、不可变的、基因特征,因此将其作为标签也是完全可以接受的(有时甚至更好)。
地址
这是一个具有子属性的可变值,不会被很多节点共享,并且从一个人到另一个人在同一地址(或者说居住在同一地区)的遍历具有重要意义。因此,这应该几乎肯定是一个节点。
身高和体重
这些随时间不断变化,没有子值,两个共享此值的人几乎没有任何含义。值的范围太广,因此标签也没有意义,因此应该是属性。
血型
虽然选项比性别多,但所有逻辑都适用,除了现在关系确实很重要(因为人们必须分享血型才能捐献)。问题是这个值会非常过载,您需要先按区域进行过滤,然后再验证血型。可以是属性或标签。节点的情况是如果您在血型之间包括“Can_Donate_To”或“Can_Accept”关系。虽然您可能不会遍历这些关系以查找潜在的捐赠者(因为它们太过载,您必须先按区域进行过滤),但您可以使用它们来验证某人是否可以成为捐赠者。

社会安全号码

这是高度敏感的信息,可能会引发诉讼。如果可能的话,请不要将其存入数据库中。如果您确实需要,这个属性是不可变的,但对于每个人来说都是唯一的,因此由于缺乏重复使用,它是一个糟糕的标签,并且作为节点是没有意义的。绝对是一个属性。(但仅出于验证目的,应进行盐值哈希)

母亲的婚前姓氏

可能的值是无限的,两个节点共享此值没有真正的意义。绝对是一个属性。

长子

由于孩子已经有了自己的节点和子属性,只需在两者之间创建关系即可。虽然这些信息的价值是可疑的,但每当您需要引用另一个节点时,始终使用关系。绝对是一个节点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接