我正在尝试决定是否应该将类别实现为节点或标签 特别是获取属于某个类别的节点数的查询并不那么容易 节点必须能够属于更多类别!
作为标签的类别,变体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()..)
能够做到这一点,但我不知道怎么做。
作为节点的类别 这是有效的...这是非常直接的转发。但是不是标签假设是分类节点的东西吗?加上我将创造的所有额外关系......
也许我应该将它作为标签和节点来实现? 然后使用标签我可以快速获得每个节点的类别。通过节点,我可以获得类别计数。
我仍在寻找关于这个问题的良好观点,所以我还不能提出具体的实施问题。
答案 0 :(得分:5)
我的两分钱。
对于您的类别类型,我会使用每个类别的节点并从属于该类别的节点创建BELONGS_TO关系。我的这种偏好有很多原因。
添加标签的原因之一是许多人在节点上放置了“type”属性。谈论标签的另一种方式是,它们会在图表中添加一些“模式” - 从某种意义上说,您可以对节点进行分类。
随着标签的引入,它们总是存在被滥用的风险。它只是数据库中的一个额外工具,主要用于存储图形。在极端情况下,您几乎可以使用标签,最后是“标记”节点存储。
最后,遍历关系是Neo4j所做的最快的事情。我们说的是微秒的单位。不要害怕向节点添加数千个关系。我会为开发人员定义的“类似架构”的信息留下标签。
因此,在用户添加类别的情况下,我肯定会创建类别节点和BELONGS_TO关系,以支持标记。
最后一个免责声明,这是一个自我营销。如果你到达每个节点有数万或数百万个关系的点,而你所追求的只是计算关系,那么将这些计数作为属性缓存在节点上可能是个好主意。我为Relationship Count Module开发了一个名为“GraphAware Framework”的模块,它就是这样做的。我在我的硕士课上演示过。论文将在几周内公开,该模块可以将高度顶点的计数查询加速几个数量级,写入吞吐量损失仅为10-25%。如果您需要更多详细信息,请与我们联系。