我正在使用Neo4j v2.2.3社区版。我想按标签查询节点数量和按类型查询关系数量。我尝试过:
MATCH (n:NODE_LABEL) RETURN COUNT(DISTINCT n)
和
MATCH ()-[r:REL_TYPE]-() RETURN COUNT(DISTINCT r)
虽然第一个查询相当快(2.5秒),但第二个查询在几分钟后仍未结束(某些类型的关系约为1亿)。然而,根据[1],Neo4j保留了这样的信息。因此,我预计会对这两种情况立即做出回应。是否有可能以不同的方式获取此信息?
提前致谢!
[1] http://neo4j.com/docs/stable/query-schema-statistics.html
答案 0 :(得分:0)
我不知道查询规划器如何使用关系类型的计数,但您可能会尝试这种稍微简单的查询:
MATCH ()-[r:REL_TYPE]->() RETURN COUNT(*)
由于没有DISTINCT
,查询计划程序可能更有可能使用这些统计信息。同时指定方向将确保关系不会被计算两次(这既错误也可能更慢)
但是如果你PROFILE
这个查询,我怀疑它会遍历数据库中的每个节点并跟随节点。 Neo4j默认为标签保留模式索引,但不保留关系类型。因此,如果你碰巧知道关系总是以某个标签(或标签)的节点开始,那么通过指定:
MATCH (:SomeLabel)-[r:REL_TYPE]->() RETURN COUNT(*)
或
MATCH (n)-[r:REL_TYPE]->()
WHERE n:SomeLabel OR n:SomeOtherLabel
RETURN COUNT(*)