MATCH 语句的 WHERE 子句,添加 rank 范围过滤,查不到数据。

  • nebula 版本:v3.6.0
  • 部署方式:单机
  • 安装方式:Docker
  • 是否上生产环境:N
  • 硬件信息
    • 磁盘( 推荐使用 SSD)
    • CPU、内存信息
  • 问题的具体描述
    这条 MATCH 查询语句,在 WHERE 子句中添加 rank(edg) 查询范围之后,查不到数据。
    MATCH p=(src:phones_tag)-[edg:dck_edge *1..3]->(dst:phones_tag) \
    WHERE id(src) == 86123456  \
      AND 1 == properties(dst).person_type   \
      # 加这个条件查不到数据
      AND (rank(edg) >= 1696089600 AND rank(edg) <= 1696262400)   \
    RETURN edg AS res;
    
    如果换成对应的 GO 查询,却能查到数据。
    GO 1 to 3 STEPS FROM 86123456 OVER dck_edge \
    WHERE (1 == properties($).person_type OR 1 == properties($^).person_type)   \
      AND (rank(edge) >= 1696089600 AND rank(edge) <= 1698132302)   \
    YIELD edge AS res;
    
  • 以上问题使用到的 schema 和测试数据如下:
    DROP SPACE IF EXISTS test_space;
    CREATE SPACE IF NOT EXISTS test_space(partition_num=15, replica_factor=3, vid_type=INT64);
    USE test_space;
    
    
    DROP TAG IF EXISTS phones_tag;
    CREATE TAG IF NOT EXISTS phones_tag (    \
        create_time DATETIME NOT NULL DEFAULT datetime() COMMENT '',  \
        person_type INT8 NOT NULL DEFAULT 0 COMMENT '',  \
        `version` INT64 NOT NULL DEFAULT 0 COMMENT '版本号,用于并发场景下的 CAS 操作。', \
    ) COMMENT = '';
    
    DROP EDGE IF EXISTS dck_edge;
    CREATE EDGE IF NOT EXISTS dck_edge( \
        create_time DATETIME NOT NULL DEFAULT datetime() COMMENT '',  \
        event_type INT8 NOT NULL COMMENT '',   \
        event_timestamp INT64 NOT NULL COMMENT '',   \
        `version` INT64 NOT NULL DEFAULT 0 COMMENT '版本号,用于并发场景下的 CAS 操作。', \
    ) COMMENT = '';
    
    DROP EDGE IF EXISTS dx_edge;
    CREATE EDGE IF NOT EXISTS dx_edge( \
        create_time DATETIME NOT NULL DEFAULT datetime() COMMENT '',  \
        event_type INT8 NOT NULL COMMENT '',   \
        event_timestamp INT64 NOT NULL COMMENT '',   \
        `version` INT64 NOT NULL DEFAULT 0 COMMENT '版本号,用于并发场景下的 CAS 操作。', \
    ) COMMENT = '';
    
    
    INSERT VERTEX phones_tag(person_type) VALUES 86123456:(1), 86654321:(1), 861234567:(0), 867654321:(1);
    INSERT EDGE dck_edge(event_type, event_timestamp) VALUES   \
        86123456->86654321@1696089600 :(1, 1696089600),  \
        86654321->861234567@1696176000 :(1, 1696176000), \
        861234567->867654321@1696262400 :(1, 1696262400);
    
1 个赞

问题已解决,原因是:匹配到的可变长度边的变量 [edg:dck_edge *1…3],edg 是 List 类型的,要用 rank(edg[0]) 的方式才可以。

3 个赞

:+1:,文档里有一个 note

Note

在对匹配的多跳边进行过滤时,如对-[e:follow*2]->中的e进行过滤,此时的e不再是单条边的数据类型,而是一个包含多条边的列表,例如:

以下语句可以运行但是没有返回数据,因为e是一个列表,没有.degree的属性。

nebula> MATCH p=(v:player{name:“Tim Duncan”})-[e:follow*2]->(v2)
WHERE e.degree > 1
RETURN DISTINCT v2 AS Friends;
这是正确的表达:

nebula> MATCH p=(v:player{name:“Tim Duncan”})-[e:follow*2]->(v2)
WHERE ALL(e_ in e WHERE e_.degree > 0)
RETURN DISTINCT v2 AS Friends;
进一步,这是表达对多跳边的第一跳的边属性过滤的表达:

nebula> MATCH p=(v:player{name:“Tim Duncan”})-[e:follow*2]->(v2)
WHERE e[0].degree > 98
RETURN DISTINCT v2 AS Friends;

1 个赞

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。