怎么快速进行条件查询?

提问参考模版:

  • nebula 版本:2.0 rc
  • 部署方式(分布式 / 单机 / Docker / DBaaS):单机
  • 问题的具体描述
    1.有一个场景的语句,要搜索当前人物姓名的顶点信息,图数据库存储的vid对应数据库表主键,姓名是属性,创建索引后,需要再给条件,比如属性年龄大于30岁,属性性别男,只有vid是唯一的,想问下这种多条件应该怎么查询?过滤后剩下一条数据
    2.条件查询支持哪些运算符?
  1. match (v) where v.age > 30 return v | limit 1
  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


提示$var找不到

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,这个可以查出来,多个条件如果不是复合索引,能不能以单个形式查询?

@bright-starry-sky 看看这个呢

你好,我尝试理解一下这个需求,不知道对不对,不对的话请指正。
需求是通过多个复合的条件扫描索引,扫描出来的结果集再进行二次运算,前一次索引扫描的输出将被用作二次运算的输入。是这样吗?

在这个例子中,有两点建议:
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对上述的查询都是有效的。

1 个赞