SELECT EXPAND vs TRAVERSE

时间:2015-05-18 15:02:21

标签: sql orientdb

我一直在玩OrientDB关于Grateful Dead的默认数据库。

我很难从两个查询中获得相同的结果,这两个查询应该提供相同的结果。但他们没有。

查询1:

select from ( traverse in(sung_by) from #9:8 while $depth<=1 ) where type='song' order by @rid

这意味着:从给定节点开始,遍历距离不超过1个节点的所有“sung_by”传入边缘,扔掉起始顶点。

查询2:

select expand( in(sung_by) ) from #9:8 order by @rid

这意味着:从相同的给定顶点开始,相应地扩展到所有传入的'sung_by'边缘。

我认为这些查询必须返回相同的结果...但我在第4条记录中已经得到了不同的值。另外,如果一个人试图计算返回的记录总数,那么在前一种情况下将是148,在后一种情况下是150.

我做错了什么?提前谢谢。

修改

我发现了问题,这很奇怪。它在'sung_by'的引号中。如果它存在,查询

select * from ( traverse in('sung_by') from #9:8 ) where type='song'

select expand( in('sung_by') ) from #9:8    

提供完全相同的结果。

我不明白为什么它首先没有引号,其次我不明白选择了哪些记录。

2 个答案:

答案 0 :(得分:0)

对于您的第二个查询,请尝试:

select from (select expand( in(sung_by) ) from #9:8) order by @rid

这意味着从#9:8开始,并展开到所有传入的sung_by边缘。现在保留此结果并按@rid命令向我显示。

您的查询问题必须位于order by部分。如果您将limit -1放在查询的末尾(即,不带分页的所有结果),这一点就变得清晰了。然后,对于您的两个查询,结果应该相同。就像应用order by和结果集时不太清楚,所以我们对内部查询变得更加明确。

答案 1 :(得分:0)

你可以尝试下面的第二个查询:

select expand(set(in(sung_by))) from #9:8 order by @rid