如何获取网络中社区中具有特定标签的节点数量?

时间:2019-01-28 16:04:29

标签: neo4j cypher

我一直在使用unionFind流算法来可视化数据库的连接组件。我想输出一张表,显示网络的所有节点,以及每个节点各自社区中特定标签的节点数量

例如-假设我有一个整个学区的教职员工列表,我想确定每个教职工学校中的教师人数(一所学校是整个学区网络的组成部分)

我尝试将setID(由unionFind.stream产生)分配给每个节点,并调用多个match语句以进一步根据节点标签进行说明。我也尝试使用没有任何运气的FOREACH语句。

CALL algo.unionFind.stream()
YIELD nodeId, setId 
MATCH(n)
SET n.setId = setId
MATCH setList = collect(setId)
WITH MATCH(n) WHERE n.setId in setList
MATCH p = (n) WHERE n._label = 'Teacher'
RETURN n.setID as component_id, count(p) as number_of_teachers;

我知道这里可能没有正确使用收集功能。我希望首先将集合ID分配给每个节点n,然后创建一个所有集合ID的列表,称为可调用的集合列表。相反,我在收集行上收到错误消息。

1 个答案:

答案 0 :(得分:0)

您没有显示数据模型,并且您的查询似乎有许多(语法和逻辑上的)错误。此外,看来您陈述的用例可以非常简单地解决。

为了节省很多时间,我只是假设您的数据模型非常基础(我将忽略所有属性):

(:Teacher)-[:TEACHES_FOR]->(:District)

使用上述数据模型,以下有效查询将返回每个District及其所拥有的TEACHES_FOR关系的数量(与我的数据模型中的教师数量相同):

MATCH (district:District)
RETURN district, SIZE(()-[:TEACHES_FOR]->(district)) AS number_of_teachers;

SIZE(()-[:TEACHES_FOR]->(district))构造利用neo4j的内部计数来计算与节点关联的每种类型的关联数,并且不需要实际访问任何关联。