NebulaGraph的多标签查询及多match查询问题

  • 需求原因 / 使用场景
    由于项目需要,现换了NebulaGraph图数据库,以前用的Neo4j,现在针对Neo4j的cypher语句 要改成Nebula语法,存在以下问题,亟待解决
  • 需求描述
    Nebula官方是否支持 以下两种查询方式,如果不支持,是否有替代方案
    (1)多标签查询:比如这样的:match(n:aaa:bbb) return n
    (2)多个match同时查,比如下面这样的:
    match(m:aaa{name:‘tom’}), (n:bbb{name:‘marry’}) return m,n
    官方最好能给个例子参考一下 解决上述两个查询语法

目前 match 的一些功能还在开发支持阶段,到年底会有一个比较全面的兼容版本发出来。当前针对你的两类查询有以下折中:

  1. 多标签支持,你的示例中其实是要全 tag 扫描,这个对 nebula 来讲是比较慢的操作,如果一定要这样,可以通过 where 来做一个过滤:match (n:aaa) where 'bbb' in tags(n) return n 其中 aaa 是创建了索引;
  2. 多 match 查询,这里的示例其实是比较简单的情况,如果仅就这个 case 而言其实是想获取一个笛卡尔集,这里暂时可以分别获取到两个集合 m, n 然后在 client 端做笛卡尔集
2 个赞

您好,第一个问题:多标签支持 我写的语句 是 match(n:aaa:bbb) return n,其中aaa和bbb是不同的tag,按照您的意思, where后面的 ‘bbb’ 这样筛选不对吧,如果按照您这样的写法,是查不出来结果的,因为aaa和bbb都没有关系
我验证的过程如下:
首先创建两个标签:aaa和bbb:
create tag aaa(id int, name string); create tag bbb(id int, name string);
然后插入几条数据给两个标签中:
insert vertex aaa(id,name) values “a1”:(1,“tom”);
insert vertex aaa(id,name) values “a2”:(2,“marry”);
insert vertex aaa(id,name) values “a3”:(3,“lucy”);
insert vertex bbb(id,name) values “b1”:(1,“tom”);
insert vertex bbb(id,name) values “b1”:(2,“hellen”);
再给aaa的name创建索引并使其生效:
create tag index aaa_name_index on aaa(name(10));
rebuild tag index aaa_name_index;
最后,验证您给的语句:
match (n:aaa) where ‘bbb’ in tags(n) return n
查询不到结果

第二个问题:我没看太懂,请指教一下 ,能给出具体语句的写法么

match(n:aaa:bbb) return n 这条语句 neo4j 也查不出来结果吧,表示同时具有这两种 label 的实体点。

我觉得这两个问题可以用 UNION 来解决吗?你问题里面好像是OR 的关系.老师给的例子是 AND
的关系.

他的条件,是OR的关系.不是AND.我觉得可以用 UNION

UNION 可以实现但是限制很多,OR 的话应该用多 pattern 解决,nebula 目前还不支持

浙ICP备20010487号