Orientdb: SELECT 为等效查询返回非常不同的结果

创建于 2016-06-10  ·  4评论  ·  资料来源: orientechnologies/orientdb

预期行为和实际行为

SELECT 查询预期返回等效结果,而不是产生非常不同的结果。

重现问题的步骤

1) 启动 orientdb 控制台并连接到 GratefulDeadConcerts 数据库。 (来自开发的 v2.2.1-SNAPSHOT)。

在接下来的两个查询中(我认为它们是等价的),我试图列出所有演唱过“Bob_Dylan”创作的歌曲的歌手。

2) 查询 1:

orientdb {db=GratefulDeadConcerts}> SELECT OUT("sung_by").name 作为歌手 FROM V WHERE OUT("written_by").name="Bob_Dylan"

+----+------------+
|# |歌手 |
+----+------------+
|0 |[堰] |
|1 |[堰] |
|2 |[Bob_Dylan] |
|3 |[Bob_Dylan] |
|4 |[Bob_Dylan] |
|5 |[Bob_Dylan] |
|6 |[Bob_Dylan] |
|7 |[Bob_Dylan] |
|8 |[加西亚] |
|9 |[加西亚] |
|10 |[Bob_Dylan] |
|11 |[Bob_Dylan] |
|12 |[Bob_Dylan] |
|13 |[加西亚] |
|14 |[Lesh] |
|15 |[Bob_Dylan] |
|16 |[加西亚] |
|17 |[全部] |
|18 |[Weir_Garcia]|
|19 |[堰] |
+----+------------+
LIMIT EXCEEDED:结果集包含更多未显示的项目(限制=20)

3) 查询 2:

orientdb {db=GratefulDeadConcerts}> 从 V WHERE IN("sung_by").OUT("written_by").name="Bob_Dylan" 中选择歌手的名字

+----+-----------+
|# |歌手 |
+----+-----------+
|0 |Weir_Garcia|
|1 |Neil_Young |
+----+-----------+

找到 2 个项目。 查询在 0.068 秒内执行。

重要问题

运行模式

  • [ ] 嵌入式,使用 PLOCAL 访问模式
  • [ ] 嵌入式,使用 MEMORY 访问模式
  • [X] 远程

    杂项

  • [ ] 我有多个服务器的分布式设置。 多少?

  • [ ] 我使用的是企业版

    东方数据库版本

  • [ ] v2.0.x - 请指定最后一个数字:

  • [ ] v2.1.x - 请指定最后一个数字:
  • [ X] v2.2.x - 请指定最后一个数字:
    OrientDB 控制台 v.2.2.1-SNAPSHOT (build develop@r3f4b9c490e67ffe2c0c2030930517509c647a334; 2016-06-07 14:02:16+1000) www.orientdb.com

    操作系统

  • [ ] Linux

  • [ ] MacOSX
  • [ ] 窗户
  • [ X] 其他 Unix (FreeBSD 10.3)
  • [ ] 其他名字?

    爪哇版

  • [ ] 6

  • [ ] 7
  • [ X] 8 (OpenJDK 8)
question

所有4条评论

@codelimner

您不应该对可以返回多个值的表达式使用=运算符(如果返回多个值,= 将不匹配),您应该使用 CONTAINS 代替。

请尝试以下操作并告诉我:

SELECT OUT("sung_by").name as singer FROM V WHERE OUT("written_by").name CONTAINS "Bob_Dylan"

SELECT name as singer FROM V WHERE IN("sung_by").OUT("written_by").name CONTAINS "Bob_Dylan"

谢谢

路易吉

@codelimner

顺便说一句,从 2.2 开始,您可以像这样使用模式匹配

MATCH 
    { class: V, as: bob, where: (name ="Bob_Dylan") } 
    <-written_by- {as : song} -sung_by-> {as : artist}
RETURN bob.name,song.name,artist.name

有关文档,请参阅此处
http://orientdb.com/docs/2.2/SQL-Match.html

@luigidellaquila是的,我必须使用 CONTAINS,并且通过这种更改,查询会按预期产生结果。

@maggiolo00 MATCH 语句非常有用。 只是对 http://orientdb.com/docs/2.2/SQL-Match.html 上的文档的一个小评论 [用例 - > 深度遍历] 部分下的第二个 MATCH 查询似乎不完整。

谢谢!

@codelimner

谢谢指点,好像是GitBook的问题,原wiki页面运行正常... https://github.com/orientechnologies/orientdb-docs/blob/master/SQL-Match.md#deep -遍历

我现在正在尝试修复它

谢谢

路易吉

此页面是否有帮助?
0 / 5 - 0 等级