- nebula 版本:v3.6.0
- 部署方式:单机
- 安装方式:Docker
- 是否上生产环境:N
- 硬件信息
- 磁盘( 推荐使用 SSD)
- CPU、内存信息
- 问题的具体描述
这条 MATCH 查询语句,在 WHERE 子句中添加 rank(edg) 查询范围之后,查不到数据。
如果换成对应的 GO 查询,却能查到数据。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 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 个赞
,文档里有一个 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 天后被自动关闭。不再允许新回复。