Nebula 查询的几个问题

1.索引问题

space里创建了一个Tag比如:person(name string, age int);
索引为 create tag index t1 on person(name);

执行以下lookup语句报错[ERROR (-8)]: Unknown error(411)
lookup on person where person.name = ‘test’ or person.age = 0;

看之前论坛帖子说是age没加索引的原因,这里为什么限制所有的字段都要加索引,只要name加索引取对应记录后按age过滤不行吗?

  1. 沿着多种类型的边遍历结果形式

按照文档试验, 如果存在多条边的属性需要返回,会把他们放在不同的行。
这样在很多场景很麻烦,比如一个User关联Friend/Teacher等实体,现在一次性取出User本身的属性及关联实体

go from 100 over friend,teacher yield $^.User.id,$$.Friend.id,$$.Daughter.id
由于返回结果在不同行,还需要将其两行合并起来

参考neo4j中做法,使用COLLECT来聚合,一次性取出很简洁
match (n:User)-[:friend|:teacher]->(d) where id(n)=100 return n.gid,COLLECT(d.gid);

3.graphstudio导入成功但是显示404配置错误
操作正常,也有数据,但是返回这个提示,很奇怪

这里为什么限制所有的字段都要加索引,只要name加索引取对应记录后按age过滤不行吗

where 里面用到的属性就是全部需要建立索引的

按照文档试验, 如果存在多条边的属性需要返回,会把他们放在不同的行

没明白你的意思,你可以把你完整的nsql发出来

由于返回结果在不同行,还需要将其两行合并起来

多条边的时候是一次性取出起点,边以及终点的所有属性的,直接在YIELD 子句将要的属性平铺拿就可以

3.graphstudio导入成功但是显示404配置错误

这个之前也有人提过了,负责的同事已经在查并解决,感谢您提的问题。

感谢回复

1.索引难道不只是为了加快查询吗,在已经有一个字段name加索引,另一个字段取值范围有限的场景下比如人的性别gender属性,完全可以不加索引,就算加了索引,优化器不也应该优先走name查询吗。
这种情况就没必要浪费空间对每个实体加gender索引了。

2.分两种情况
【1】查询单条边

比如查询User关联的所有Friend,如下

nebula> lookup ... | go from $-.uservid over friend yield $^.User.id,$$.Friend.id

返回如下结果:

====================================
| User.id | Friend.id | 
====================================
| 99    | 31      | 
------------------------------------
| 99    | 32      |
------------------------------------
| 100    | 95      | 
------------------------------------
| 100    | 89      |
------------------------------------
| 100    | 90      |
------------------------------------

这样的结果还需要人为去按User.id合并,能否直接返回如下形式

====================================
| User.id | Friend.id | 
====================================
| 99    | 31,32      | 
------------------------------------
| 100    | 95,89,90      | 
------------------------------------

对应如下查询语句

nebula> lookup ... | go from $-.uservid over friend yield $^.User.id, COLLEC[$$.Friend.id]

【2】查询多条边

如果存在多条边的属性需要返回,会把他们放在不同的行。比如:

nebula> GO FROM 100 OVER follow, serve YIELD follow.degree, serve.start_year;

返回如下结果:

====================================
| follow.degree | serve.start_year |
====================================
| 0             | 1997             |
------------------------------------
| 95            | 0                |
------------------------------------
| 89            | 0                |
------------------------------------
| 90            | 0                |
------------------------------------

能否直接返回如下形式

====================================
| follow.degree | serve.start_year |
====================================
| [95.89,90]             | 1997             |

感谢您的试用,您所说的功能会在Nebula2.0中支持。

你好关于第 3 个问题,可以给一下复现的步骤么?因为我这边试了几次导入都是成功的,你那边是稳定会报这个错么?

  1. 你现在使用的版本,索引对于查询性能没有任何帮助。所以不需要使用。

是的 就是按照官网步骤导入 一直报404错 我是docker环境

索引对于查询性能没有任何帮助? 我这里就是不想给age加索引啊 但是现在的要求是age必须加上索引才能用在where语句中判断

因为这里索引的目的是为了根据属性查VID,不是为了性能。