提问参考模版:
- nebula 版本:2.0 rc
- 部署方式(分布式 / 单机 / Docker / DBaaS):单机
- 问题的具体描述
1.有一个场景的语句,要搜索当前人物姓名的顶点信息,图数据库存储的vid对应数据库表主键,姓名是属性,创建索引后,需要再给条件,比如属性年龄大于30岁,属性性别男,只有vid是唯一的,想问下这种多条件应该怎么查询?过滤后剩下一条数据
2.条件查询支持哪些运算符?
提问参考模版:
条件有3个,name=‘小明’,age>30,sex=‘male’,能不能将单个条件查询出来的结果再次加条件查询或者更好的方法
where name = ‘小明’ && age > 30 && sex = ‘male’
直接这样?
对的
如果有多个条件怎么查询?条件属性是未知的,能不能将上一个查询的结果当做结果集再在里面查询,或者其他的办法
直接这样写就可以了
可以,参考
https://docs.nebula-graph.io/1.1/manual-EN/2.query-language/3.language-structure/pipe-syntax/
https://docs.nebula-graph.io/1.1/manual-EN/2.query-language/3.language-structure/user-defined-variables/
$var=LOOKUP ON person WHERE person.grade >1 yield person.name,person.age,person.grade;LOOKUP ON $var WHERE person.age >9 yield person.name,person.age,person.grade
2.0的文档更新了。在上面找到了
$var=lookup on person where person.grade>1 yield person.grade as grade,person.age as age;yield $var.age,$var.grade where $var.age>9,这个可以查出来,多个条件如果不是复合索引,能不能以单个形式查询?
你好,我尝试理解一下这个需求,不知道对不对,不对的话请指正。
需求是通过多个复合的条件扫描索引,扫描出来的结果集再进行二次运算,前一次索引扫描的输出将被用作二次运算的输入。是这样吗?
在这个例子中,有两点建议:
1,假设索引扫描的判断条件是 “where name = ‘小明’ && age > 30 && sex = ‘male’”,那么在创建索引时,建议索引的column结构是(name, sex, age)。也就是尽量把==查询的列往前放,性能会有很大提升。
2,如果想要进行二次计算,除了上术的var模式,还可以试一下pipe 模式,例如 lookup … | go … , 这个查询模式会将lookup的输出做为go的输入。
参考
https://docs.nebula-graph.io/1.1/manual-EN/2.query-language/3.language-structure/pipe-syntax/
另外,上文中指的“多个条件如果不是复合索引,能不能以单个形式查询?” 指的是什么?能举个例子吗?
比如tag有id,name,age,sex,time5个字段,只对tag每个字段建了索引,没有建复合索引,而查询条件字段是动态配置的,比如动态传入3个条件,name = ‘小明’ && age > 30 && sex = ‘male’,事先并不知道要查询的条件哪几个字段。这种形式我这边想到是通过单个条件查询返回tag中所有字段,再在查询出结果中再加条件查询,在探索有没有更高效的方法?
如果是where表达式中都是 OR , 可以在tag的每个字段上创建一个index。如果是 AND , 只能使用复合索引。
复合索引的使用中,依照左匹配原则,类似于mysql的RBO优化规则。例如:
tag (c1, c2, c3, c4)
index on tag (c1, c2, c3, c4)
where c1 ==1
where c1 == 1 and c2 ==1
where c1 == 1 and c2 == 1 and c3 == 1 …
这个index对上述的查询都是有效的。