Neo4j COUNT函数和查询混淆

时间:2018-02-12 17:27:57

标签: neo4j cypher

我刚刚开始使用Neo4j,如果你愿意,可以踢轮胎,但我得到了一个我没想到的数量。

我有一个虚拟数据库,有999名员工做过费用索赔(26901 - 我知道这是一个奇数,我有一个循环运行插入虚拟费用索赔使用setInterval在javascript中随机声明随机员工,我忘了阻止它:S:))。

目标 我想知道有多少员工在我的数据库中提出了费用索赔。

我开始使用以下查询:

MATCH (ex:EXPENSE)<-[:MADE_EXPENSE_CLAIM]-(employee:Employee)-[:WORKS_IN]->(:Department) 
RETURN COUNT(employee)`

然而,由于我的计数,我得到了20211,这看起来有点高。

如果我以不同的方式运行查询,我会得到更有意义的结果(结果为918):

MATCH (n:Employee)-[:WORKS_IN]->(:Department)
WHERE (n)-[:MADE_EXPENSE_CLAIM]->()
RETURN COUNT(n)`

有谁能告诉我我的两个查询在做什么以及哪一个(如果有的话)实际上实现了我的目标?如果没有,请你更正我的问题?

1 个答案:

答案 0 :(得分:1)

您的第一个查询会返回部门中所有员工的费用索赔总数。

您的第二个查询会返回已作出费用索赔的部门中的员工数量。

要简单地返回已经做出费用索赔的不同员工的数量,您可以做这样的事情......

MATCH (ex:EXPENSE)<-[:MADE_EXPENSE_CLAIM]-(employee:Employee)
RETURN count(DISTINCT employee)

要查看每位员工的费用索赔数量,您可以执行此类操作。行数将是已作出费用索赔的不同员工的数量。如果MADE_EXPENSE_CLAIM仅指向费用,则可以通过删除Expense节点的标签来节省查询中的一些开销。

MATCH ()<-[:MADE_EXPENSE_CLAIM]-(employee:Employee)
RETURN employee.name, count(*)