Neo4j 计数查询

Neo4j count Query

match(m:master_node:Application)-[r]-(k:master_node:Server)-[r1]-(n:master_node) 
where (m.name contains '' and (n:master_node:DeploymentUnit or n:master_node:Schema)) 
return distinct m.name,n.name

你好,我正在尝试获取上述的记录总数query.How我使用计数函数更改查询以直接获取记录计数。

提前致谢

您可以在 Neo4j 文档中找到有关如何使用计数的示例 here

在你的例子中,第一个例子是:

count(*)

用于 return 每个 returned 项目的计数应该有效。

以下查询使用 aggregating funtion COUNT。不同的 m.name, n.name 值对用作“分组键”。

MATCH (m:master_node:Application)--(:master_node:Server)--(n:master_node) 
WHERE EXISTS(m.name) AND (n:DeploymentUnit OR n:Schema)
RETURN m.name, n.name, COUNT(*) AS cnt

我假设您查询中的 m.name contains '' 是试图测试 m.name 是否存在。此查询使用 EXISTS() 函数来更有效地进行测试。

[更新]

要确定数据库中不同的 nm 对的数量(而不是每对出现在数据库中的次数):

MATCH (m:master_node:Application)--(:master_node:Server)--(n:master_node) 
WHERE EXISTS(m.name) AND (n:DeploymentUnit OR n:Schema)
WITH DISTINCT m.name AS n1, n.name AS n2
RETURN COUNT(*) AS cnt

进一步加快查询速度需要考虑的一些事项:

  1. MATCH 模式中删除不必要的标签测试。例如,我们可以省略任何节点的 master_node 标签测试吗?事实上,我们是否可以省略任何节点的所有标签测试而不影响结果的有效性? (不过,您可能需要在至少一个节点上添加标签,以避免在开始查询时扫描所有节点。)

  2. 你能为每个关系添加一个方向(以避免必须在两个方向上遍历关系)吗?

  3. MATCH 模式中指定关系类型。这将更早地过滤掉不需要的路径。一旦你这样做了,你也可以从模式中删除一些节点标签,只要你仍然可以获得相同的结果。

  4. 使用PROFILE子句评估不同Cypher查询所需的DB命中数。