最近在用Neo4j 感觉速度不够快,求老司机鉴定一下是不是就这么慢

大体需求如下:数据库里只存了一种节点,节点有一个参数【类型】,可能是A,B,C,两个节点之间会双向链接,连接关系也只有一种。
要求计算所有的【环】,环要从B类型的节点出发,每步只连接C类型的节点,最后连接到一个和起点相连的B类型节点/原节点结束。以下是我学了一宿写出来的的CQL,200个节点,800个连接关系,每次一搜都得20多秒,感觉好慢啊!

MATCH (start:Device {type: "B"})
CALL apoc.path.expandConfig(start, {
    relationshipFilter: "CONNECTED_TO>",
    labelFilter: ">Device",
    minLevel: 1,
    maxLevel: 9999,
    uniqueness: 'NODE_PATH'
}) YIELD path
WHERE LENGTH(path) >= 3
      AND ALL(node IN nodes(path)[1..-1] WHERE node.type = "C")
      AND last(nodes(path)).type = 'B'
      AND id(start) <= id(last(nodes(path)))
RETURN path

我找到解决方案了,因为我的问题是比较特化的,所以与其建立同一种节点,然后给他们分配不同的【类型】,倒不如建立三种节点,然后再用apoc.path.expandConfig函数的labelFilter参数来进行过滤,比如我的CQL可以写成

MATCH (start:B_Device)
CALL apoc.path.expandConfig(start, {
    relationshipFilter: "CONNECTED_TO>",
    labelFilter: "+C_Device|/B_Device",
    // sequence: "",
    minLevel: 1,
    maxLevel: 9999,
    uniqueness: 'NODE_PATH'
}) YIELD path
WHERE LENGTH(path) >= 3
      AND ALL(node IN nodes(path)[1..-1] WHERE node.type = "C")
      AND last(nodes(path)).type = 'B'
      AND id(start) <= id(last(nodes(path)))
RETURN path

时间从原来的20多秒缩减到了不到1毫秒。太强了!

这个过滤方式连AI都没想到,还得是我 :innocent: