首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用neo4j cypher query创建按关系数量划分的节点直方图?

如何使用neo4j cypher query创建按关系数量划分的节点直方图?
EN

Stack Overflow用户
提问于 2017-11-22 01:57:27
回答 4查看 846关注 0票数 3

我有一大堆节点,它们与下面的cypher匹配:

代码语言:javascript
复制
(:Word)<-[:Searched]-(:Session)

我想要制作一个直方图,显示每个搜索关系频率下的单词节点数。

我想做这样的图表:

代码语言:javascript
复制
Searches Words
0        100
1-5      200
6-10     150
11-15    50
16-20    25

我刚开始使用neo4j,我不确定如何实现这一点,甚至不知道是否有一种方法可以用cypher来指定。我所能做的最接近的就是计算关系数并得到平均值。

代码语言:javascript
复制
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

这是基于这里的一个示例:https://neo4j.com/developer/kb/how-do-i-produce-an-inventory-of-statistics-on-nodes-relationships-properties/

我还看到使用模运算符进行分组以获取存储桶,尽管我不确定如何在引用计数时使用它:Neo4j cypher time interval histogram query of time tree

有没有一种“最好”的方法来做到这一点?

EN

回答 4

Stack Overflow用户

发布于 2017-11-22 04:12:56

下面的代码应该可以工作:

代码语言:javascript
复制
WITH 5 AS gSize
MATCH (w:Word)
OPTIONAL MATCH (w)<-[s:Searched]-()
WITH gSize, w, TOINT((COUNT(s) + (gSize-1))/gSize * gSize) AS m
RETURN
  CASE m WHEN 0 THEN '0' ELSE (m-gSize+1)+'-'+m END AS range,
  COUNT(*) AS ct
ORDER BY range;

使用@GaborSzarnyas提供的示例数据,输出为:

代码语言:javascript
复制
+-------------+
| range  | ct |
+-------------+
| "0"    | 1  |
| "1-5"  | 1  |
| "6-10" | 1  |
+-------------+
票数 2
EN

Stack Overflow用户

发布于 2017-11-22 02:22:04

我能够想出一个我认为能得到我想要的数据的查询:

代码语言:javascript
复制
MATCH (n:Word) 
WITH n, 5 AS bucketsize
WITH (FLOOR(SIZE( (n)<-[:Searched]-() ) / bucketsize) * bucketsize) AS numRels
RETURN numRels, COUNT(*)
ORDER BY numRels ASC

它没有得到我想要的零行,但它似乎不是这样工作的。希望其他人有更好的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2017-11-22 02:23:03

我创建了一个包含三个单词的简单示例数据集:没有搜索的w1,有3个搜索的w2和有6个搜索的w3

代码语言:javascript
复制
CREATE (w1:Word {w: '1'})
WITH count(*) AS dummy

CREATE (w2:Word {w: '2'}) WITH w2
UNWIND range(1, 3) AS i
CREATE (w2)<-[:Searched]-(:Session)
WITH count(*) AS dummy

CREATE (w3:Word {w: '3'}) WITH w3
UNWIND range(1, 6) AS i
CREATE (w3)<-[:Searched]-(:Session)

我会这样做:首先,让我们创建一个列表,其中包含每个存储桶的上限:

代码语言:javascript
复制
RETURN [i IN range(0, 4) | i*5] AS upperLimits

╒══════════════╕
│"upperLimits" │
╞══════════════╡
│[0,5,10,15,20]│
└──────────────┘

其次,将其与从列表中选择具有足够大的上限的元素的list comprehension一起使用。第一个是我们的存储桶,所以我们用[0]列表索引器选择它。剩下的只是计算下限并对行进行排序:

代码语言:javascript
复制
WITH [i IN range(0, 4) | i*5] AS upperLimits
MATCH (n:Word) 
WITH upperLimits, ID(n) AS n, size((n)<-[:Searched]-()) AS numOfRelationships
WITH
  [upperLimit IN upperLimits WHERE numOfRelationships <= upperLimit][0] AS upperLimit,
  count(n) AS count
RETURN
  upperLimit - 4 AS lowerLimit,
  upperLimit,
  count
ORDER BY lowerLimit

查询将产生以下结果:

代码语言:javascript
复制
╒════════════╤════════════╤═══════╕
│"lowerLimit"│"upperLimit"│"count"│
╞════════════╪════════════╪═══════╡
│-4          │0           │1      │
├────────────┼────────────┼───────┤
│1           │5           │1      │
├────────────┼────────────┼───────┤
│6           │10          │1      │
└────────────┴────────────┴───────┘

潜在的改进:

(1)如果numOfRelationships的值大于最大上限,则上面的查询将返回空列表的第一个元素,即null。为了避免这种情况,1)设置一个足够大的上限,例如

代码语言:javascript
复制
MATCH (n:Word) 
WITH max(size((n)<-[:Searched]-())) AS maxNumberOfRelationShips
WITH [i IN range(-1, maxNumberOfRelationShips/5+1) | {lower: i*5-4, upper: i*5}] AS limits
RETURN *

您可以在coalesce中使用具有"16或更大“语义的顶部存储桶。

(2) -4作为下限不是很好,我们可以使用CASE去掉它。

把所有这些放在一起,我们得到这个:

代码语言:javascript
复制
MATCH (n:Word) 
WITH max(size((n)<-[:Searched]-())) AS maxNumberOfRelationShips
WITH [i IN range(0, maxNumberOfRelationShips/5+1) | i*5] AS upperLimits
MATCH (n:Word) 
WITH upperLimits, ID(n) AS n, size((n)<-[:Searched]-()) AS numOfRelationships
WITH
  [upperLimit IN upperLimits WHERE numOfRelationships <= upperLimit][0] AS upperLimit,
  count(n) AS count
RETURN 
  CASE WHEN upperLimit - 4 < 0 THEN 0 ELSE upperLimit - 4 END AS lowerLimit,
  upperLimit,
  count
ORDER BY lowerLimit

这会导致:

代码语言:javascript
复制
╒════════════╤════════════╤═══════╕
│"lowerLimit"│"upperLimit"│"count"│
╞════════════╪════════════╪═══════╡
│0           │0           │1      │
├────────────┼────────────┼───────┤
│1           │5           │1      │
├────────────┼────────────┼───────┤
│6           │10          │1      │
└────────────┴────────────┴───────┘
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47419651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档