Neo4j 统计关系数量时的技巧

今天产品经理给了我一个需求,让我统计下我们数据中的某些类型关系的数量,因为涉及到保密,我就假设他让我统计的关系名称为 FRIENDFATHER,其中 FRIEND 在创建时没有指定方向,FATHER 创建时有方向。

当统计这两种关系的数量时,我的建议是 Cypher 语句中不要带有节点标签,或者只在一端带标签,因为在我的测试中,两端都带有节点标签时,查询会超时(因为我们的数据量确实比较大):

不建议的写法:

1
MATCH (:Person)-[r:FATHER]->(:Person) return COUNT(r);

建议的写法:

1
2
3
MATCH ()-[r:FATHER]->() return COUNT(r);
or
MATCH (:Person)-[r:FATHER]->() return COUNT(r);

在查询 FRIEND 这种在创建时没有指定方向的关系是,也需要用带方向的查询语句,因为 Neo4j 实际存储时是带有方向的,详情见:http://blog.csdn.net/hwz2311245/article/details/54602706),在不指定方向的情况下,我这里的查询也是超时:

不建议的写法:

1
MATCH ()-[r:FRIEND]-() return COUNT(r);

建议的写法

1
MATCH ()-[r:FRIEND]->() return COUNT(r);