3

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

类别作为标签,变体 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()..)可以做到这一点,但我不知道如何。

作为节点的类别是的,这很有效……这很简单。但是标签不应该是对节点进行分类的东西吗?加上我将要创建的所有额外关系..

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

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

4

1 回答 1

6

我的两分钱。

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

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

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

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

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

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

于 2013-09-02T10:11:43.617 回答