Neo4j 节点类别是作为标签、作为节点还是作为标签和节点?

Neo4j 节点类别是作为标签、作为节点还是作为标签和节点?,neo4j,Neo4j,我正在尝试决定是否将类别实现为节点或标签。 尤其是查询属于某个类别的节点数并不容易。 节点必须能够属于更多类别 类别作为标签,变体1 在某处保留类别列表,然后: MATCH a:cat1, b:cat2, c:cat3, ... 有了很多分类,我会得到很多专栏。。所以这不是很好。还有大量的查询预处理。 我甚至不知道我是否能从中轻易地数到 类别作为标签,变体2 MATCH n:category <-- the category label is used to limit the amou

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

类别作为标签,变体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","cat1","cat2"], 2 <-- two nodes found with category "cat1" and "cat2"
["category","cat1"], 4 <-- four nodes found with category "cat1"
[“类别”、“一类”、“二类”],2我的两分钱

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

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

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

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

因此,在用户添加类别的情况下,我肯定会创建类别节点并属于关系,支持标签


最后一件事是免责声明,这有点自我营销。如果每个节点都有上万个或数百万个关系,而您所追求的只是计算这些关系,那么最好将这些节点上的计数作为属性缓存。我开发了一个名为“”的模块,它正是这样做的。我已经在我的MSc上演示过了。这篇论文将在几周后公开,该模块将高次顶点的计数查询速度提高了几个数量级,而写吞吐量损失仅为10-25%。如果您需要更多详细信息,请告诉我。

有多少类别?这些节点是否也要按其他类别进行分类,还是只有一种类别?我的应用程序最初只有一个用户,我猜一个用户将创建大约10-50个类别。用户可以定义自己的类别,因此随着用户基数的增长,类别也会随之增长。这只是一种分类。节点有不同的方式对它们进行分组,但这将通过将它们附加到分组节点来实现。我考虑过在类别中使用的标签前面加上
“cat\ux”
。Thx作为答案,我接受,因为它充分解释了应该使用哪些标签以及不应该使用哪些标签。我使用的是RESTAPI,框架和模块是否可以通过REST使用?也许框架还定义了其他密码功能?我想知道后续信息。谢谢。是的,这个框架可以从REST和Cypher中使用,因为它目前所做的只是在幕后将额外的元数据写入到图形中。可以使用所有API(包括Cypher)读取这些内容。但是,支持可能会更好,并且已经在路线图上了。我建议你从没有它开始,先开发你的功能。当您开始测量和优化性能时,请与我联系(请访问graphaware.com)。在这一点上,框架有可能做得更多。祝你好运
["category","cat1","cat2"], 2 <-- two nodes found with category "cat1" and "cat2"
["category","cat1"], 4 <-- four nodes found with category "cat1"