我有一大堆节点与下面的密码相匹配:
(:Word)<-[:Searched]-(:Session)
我想在搜索关系的每个频率上制作一个Word节点数的直方图 .
我想制作这种图表:
Searches Words
0 100
1-5 200
6-10 150
11-15 50
16-20 25
我刚刚开始使用neo4j,我不知道如何处理这个问题,或者即使有一种方法可以在cypher中指定它 . 我最接近的是计算关系并获得平均值 .
MATCH (n:Word)
RETURN
DISTINCT labels(n),
count(*) AS NumofNodes,
avg(size((n)<-[:Searched]-())) AS AvgNumOfRelationships,
min(size((n)<-[:Searched]-())) AS MinNumOfRelationships,
max(size((n)<-[:Searched]-())) AS MaxNumOfRelationships
我've also seen use of the modulus operator for grouping to get buckets, though I'我不知道如何使用它来引用计数:Neo4j cypher time interval histogram query of time tree
有没有“最好”的方法来做到这一点?
4 回答
我能够找出一个我认为能得到我想要的数据的查询:
它没有得到我想拥有的零行,但似乎它起作用 . 希望其他人有更好的解决方案 .
以下应该有效:
使用@GaborSzarnyas提供的示例数据,输出为:
我创建了一个包含三个单词的简单示例数据集:
w1
没有搜索,w2
有3次搜索,w3
有6 .我会这样做:首先,让我们创建一个列表,其中包含每个桶的上限:
其次,使用list comprehension选择列表中具有足够大上限的元素 . 其中第一个是我们的存储桶,因此我们使用
[0]
列表索引器选择它 . 其余的只是计算下限和排序行:该查询提供以下结果:
潜在改进:
(1)如果
numOfRelationships
的值大于最大上限,则上面的查询将返回空列表的第一个元素,即null
. 为了避免这种情况,要么1)设置足够大的上限,例如,您可以将"16 or larger"语义的顶部存储区与coalesce一起使用 .
(2)
-4
作为下限不是很好,我们可以使用CASE
来摆脱它 .把所有这些放在一起,我们得到这个:
结果如下:
我在这种情况下通常做的是我使用neo4j中的设置,如果你将整数除以整数,你会得到一个整数 . 这简化了查询 . 我们为0添加一个特殊情况,它们都适合一行 .
这回来了
-1,0,5,5,5,10
考虑到你想要将1-5组合在一起,这是不理想的,但我认为足够好 .