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

Fli*_*lip 3 neo4j

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

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

MATCH a:cat1, b:cat2, c:cat3, ...
Run Code Online (Sandbox Code Playgroud)

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

作为标签的类别,变体2

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

将返回如下内容:

["category","the actual category label"], 2
Run Code Online (Sandbox Code Playgroud)

看起来很完美,但是当节点有多个类别时,这将不起作用

["category","cat1","cat2"], 2 <-- two nodes found with category "cat1" and "cat2"
["category","cat1"], 4 <-- four nodes found with category "cat1"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Mic*_*man 5

我的两分钱.

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

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

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

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

因此,对于用户添加的类别,我肯定会创建类别节点和BELONGS_TO关系,以支持标记.

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