节点类别作为标签,节点或标签和节点?

时间:2013-09-01 18:10:54

标签: neo4j

我正在尝试决定是否应该将类别实现为节点或标签 特别是获取属于某个类别的节点数的查询并不那么容易 节点必须能够属于更多类别!

作为标签的类别,变体1
在某处保留一个类别列表,然后:

MATCH a:cat1, b:cat2, c:cat3, ...

有很多类别我会得到很多专栏......所以这不是很好。还有很多关于查询的预处理 甚至不确定我是否可以从中轻松获得一个数。

作为标签的类别,变体2

MATCH n:category <-- the category label is used to limit the amount of nodes
RETURN DISTINCT labels(n), count(*) as count

会返回类似的内容:

["category","the actual category label"], 2

看起来很完美,但是当节点有多个类别

时,这不起作用
["category","cat1","cat2"], 2 <-- two nodes found with category "cat1" and "cat2"
["category","cat1"], 4 <-- four nodes found with category "cat1"

现在我不知道如何获得每个类别的计数...
也许extract(..labels()..)filter(..labels()..)能够做到这一点,但我不知道怎么做。

作为节点的类别 这是有效的...这是非常直接的转发。但是不是标签假设是分类节点的东西吗?加上我将创造的所有额外关系......

也许我应该将它作为标签和节点来实现? 然后使用标签我可以快速获得每个节点的类别。通过节点,我可以获得类别计数。

我仍在寻找关于这个问题的良好观点,所以我还不能提出具体的实施问题。

1 个答案:

答案 0 :(得分:5)

我的两分钱。

对于您的类别类型,我会使用每个类别的节点并从属于该类别的节点创建BELONGS_TO关系。我的这种偏好有很多原因。

添加标签的原因之一是许多人在节点上放置了“type”属性。谈论标签的另一种方式是,它们会在图表中添加一些“模式” - 从某种意义上说,您可以对节点进行分类。

随着标签的引入,它们总是存在被滥用的风险。它只是数据库中的一个额外工具,主要用于存储图形。在极端情况下,您几乎可以使用标签,最后是“标记”节点存储。

最后,遍历关系是Neo4j所做的最快的事情。我们说的是微秒的单位。不要害怕向节点添加数千个关系。我会为开发人员定义的“类似架构”的信息留下标签。

因此,在用户添加类别的情况下,我肯定会创建类别节点和BELONGS_TO关系,以支持标记。

最后一个免责声明,这是一个自我营销。如果你到达每个节点有数万或数百万个关系的点,而你所追求的只是计算关系,那么将这些计数作为属性缓存在节点上可能是个好主意。我为Relationship Count Module开发了一个名为“GraphAware Framework”的模块,它就是这样做的。我在我的硕士课上演示过。论文将在几周内公开,该模块可以将高度顶点的计数查询加速几个数量级,写入吞吐量损失仅为10-25%。如果您需要更多详细信息,请与我们联系。