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

  • nebula 版本:v2.6.1
  • studio 版本:v3.1.0
  • 部署方式 :单机
  • 安装方式:Docker
  • 是否为线上版本: N

需求是查询给定的边是否存在,用的是basketballplayer数据集
查询语句如下:
$b_0 = FETCH PROP ON serve “player100” → “team204”;
$b_1 = FETCH PROP ON serve “player138” → “notExistVertex”;
yield size($b_0) != 0 AND size($b_1) != 0 as exist;

“player138” → "notExistVertex"边是不存在的,期望返回false
但用studio多次查询有的时候返回true,有的时候返回false

你用 Console 执行下相同的语句,也是一样的结果吗?

是的

insert的数据能否给出一部分用于复现和排查bug?

就是你们提供的basketballplayer数据集,我是用studio导入的

https://docs-cdn.nebula-graph.com.cn/dataset/dataset.zip

我们同事暂未复现这一情况,能提供一下完整的创建 schema 以及插入数据的过程来复现下

插个眼

这边成功复现了,fetch的结果是稳定的,应该是$b_0和$b_1两个变量的值出了些问题,还在排查。

https://github.com/vesoft-inc/nebula/issues/3211 可能是这个bug

是不能用变量表达式吗?

我目前的需求是判断给定的一系列点和边是否存在,如果用上面的语句只判断给定的点是否存在,没有出现未定义行为,判断边的时候出现了

大佬们,这个问题怎么解决呢?或者说判断给定的一系列点和边是否存在应该怎么查比较好?

检查返回结果的行数,0行就是不存在

这个问题是已知的,和 variable 在实现层生命的周期管理有关。类似的用法我们认为是不合理的,所以在最新的版本 yield $var 的语法已经被禁用。

你的需求可以用其他更好方式解决,比如:

MATCH (v:player)-->(n:team)
 WHERE (v.name=="player100" and n.name=="team204") or  (v.name=="player138" and n.name=="notExistVertex")
RETURN case count(*) when 0 then false else true end as result
1 个赞

我们的关系链比较长,edge_type也不一样。目的是判断整个关系链存不存在,如果用match的话对性能是有影响的,因此想着是判断关系链上的所有点和边是否存在。如果变量和yield不能一起用的话,还是按之前的思路,用fetch加管道符来连接应该是可以的吧

你说的“关系链”是说比较长的 pattern 吗

对,比如这样的(:player)-[:friend *0…50]->(v:player)-[]->(n:team)-[]->(a:city)-[]->(b:country)

那这样的需求 go 语句根本无法满足,go 语句的路径只支持单步和多步相同边类型的路径,这样的 pattern 只能用 match 语句实现。