多次查询给定的边是否存在,返回结果不一致

这样match比较长的话查询太慢了,如果能判断所有的点和所有的边都存在,那么也可以认为这样的pattern是存在的。现在的话如果$var不能和yield一起用了,那对于复合查询需要返回多个结果做聚合的场景该怎么处理呢,只能用管道符了吗?

你们这个需求用 match 语句是怎么实现的?

现在查询在不在,就是用match 语法按照模式去查一遍,觉得这样做太慢了

match 确实优化还做得不太好

这里感觉很奇怪啊,限制yield中使用variable会丢失ngql的灵活性,在ngql中判断一批点或边是否同时存在有什么更好的方案吗

行数怎么检查呢?我这样查nebula直接挂了 FETCH PROP ON serve “player100” → “team204” yield count(*) != 0

类似的语句都不支持聚合函数,应该都是 bug,可以提个 issue
可以用下面语句:

FETCH PROP ON serve "player100" -> "team204" yield id(edge) | yield count(*)

我的意思是你在应用里面直接检查返回结果集的行数

你说的“判断一批点或边是否同时存在”,你之前用 ngql 是怎么表达的,用 cypher 表达是下面这样?

MATCH p=(a)--(b)--(c)
WHERE all(item in ["vid1", "vid2", ...] where item==id(a) or item==id(b) or item==id(c))
RETURN p

我明白你的意思,如果我只是查一条边或一个点可以用返回结果集的行数,如果是一批点和边的话就不知道这样的语句该怎么写了,变量和yield不能同时用感觉很多类似的需求都干不了

可以用union

fetch语句是支持多条边或者多个点的

fetch语句支持多条边这个我知道,但是如果一批边的edge_type不一样就不行了,我的需求是判断给定的一批点和边是否存在,希望只查一次,但是union好像不能同时查点和边,不过我们的场景只查一批边是否存在也是可以的,用union确实可以。但是会把所有查出来的属性都返回,而我只需要知道查出来了多少行,union+count的用法该怎么写呢?

最好是用match,match后续版本会有优化。
临时的话如前面说的可以用UNION,试试这个,顺便体会下reduce的神奇吧:
((FETCH PROP ON serve “player100” → “team204” | yield count(*) as count) UNION
(FETCH PROP ON serve “player138” → “notExistVertex” | yield count(*) as count))
| yield reduce(exist=true, item in collect($-.count) | exist AND item==1)

2 个赞

@xjc :+1::+1::+1:

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。