OrientDb - Select 使用图从多个顶点
OrientDb - Select from multiple vertices using graph
我刚开始使用 nosql 数据库,尤其是 OrientDB。我之前的经验是关系数据库,主要是 SQL 服务器。
在 MSSQL 中,我可以这样做:
SELECT s.url, p.title
FROM Site s
JOIN Page p ON s.Id = p.SiteId
它会给我所有页面的 table,以及它们所属网站的 url:
url | title
----------------------------
site1.com | page1
site1.com | page2
site2.com | page1
现在,在 OrientDb 中,我的理解是您应该对单向关系使用 link
,或者对双向关系使用 edge
。因为我想知道哪些页面属于一个站点,以及特定页面属于哪个站点,所以我决定在这种情况下使用边缘。站点和页面 classes/vertices 已经以类似的方式创建,但我不知道如何获得类似的结果集。来自文档 (https://orientdb.com/docs/2.2/SQL.html):
OrientDB allows only one class (classes are equivalent to tables in
this discussion) as opposed to SQL, which allows for many tables as
the target. If you want to select from 2 classes, you have to execute
2 sub queries and join them with the UNIONALL function
他们的例子 SELECT FROM E, V
然后变成了 SELECT EXPAND( $c ) LET $a = ( SELECT FROM E ), $b = ( SELECT FROM V ), $c = UNIONALL( $a, $b )
,但这不是我想要的。结果是
url | title
----------------------------
site1.com |
site1.com |
site2.com |
| page1
| page2
| page1
我将如何创建原始结果集,就像在 MSSQL 中一样?
其他注意事项:我在 MSSQL 方面的培训和经验表明,数据库操作应该在数据库中完成,而不是在应用程序代码中完成。例如,我可以进行一次数据库调用以获取 s.url
和 s.id
字段,然后进行第二次调用以获取 p.title
和 p.SiteId
字段,然后匹配它们在应用程序代码中。我避免这种情况的原因是因为多个数据库调用在时间方面的效率低于 return extra/redundant 信息所花费的时间(在我的示例中,site1.com
是 return编辑了两次)。
OrientDb 或一般的 graph/nosql 数据库可能不是这种情况吗?我是否应该进行两次单独的调用以获取我需要的所有数据,即 SELECT FROM Site WHERE Url = "site1.com"
和 SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com"
?
谢谢
试试这个:
select Url, out("HasPages").title as title from Site unwind title
希望对您有所帮助
此致
我刚开始使用 nosql 数据库,尤其是 OrientDB。我之前的经验是关系数据库,主要是 SQL 服务器。
在 MSSQL 中,我可以这样做:
SELECT s.url, p.title
FROM Site s
JOIN Page p ON s.Id = p.SiteId
它会给我所有页面的 table,以及它们所属网站的 url:
url | title
----------------------------
site1.com | page1
site1.com | page2
site2.com | page1
现在,在 OrientDb 中,我的理解是您应该对单向关系使用 link
,或者对双向关系使用 edge
。因为我想知道哪些页面属于一个站点,以及特定页面属于哪个站点,所以我决定在这种情况下使用边缘。站点和页面 classes/vertices 已经以类似的方式创建,但我不知道如何获得类似的结果集。来自文档 (https://orientdb.com/docs/2.2/SQL.html):
OrientDB allows only one class (classes are equivalent to tables in this discussion) as opposed to SQL, which allows for many tables as the target. If you want to select from 2 classes, you have to execute 2 sub queries and join them with the UNIONALL function
他们的例子 SELECT FROM E, V
然后变成了 SELECT EXPAND( $c ) LET $a = ( SELECT FROM E ), $b = ( SELECT FROM V ), $c = UNIONALL( $a, $b )
,但这不是我想要的。结果是
url | title
----------------------------
site1.com |
site1.com |
site2.com |
| page1
| page2
| page1
我将如何创建原始结果集,就像在 MSSQL 中一样?
其他注意事项:我在 MSSQL 方面的培训和经验表明,数据库操作应该在数据库中完成,而不是在应用程序代码中完成。例如,我可以进行一次数据库调用以获取 s.url
和 s.id
字段,然后进行第二次调用以获取 p.title
和 p.SiteId
字段,然后匹配它们在应用程序代码中。我避免这种情况的原因是因为多个数据库调用在时间方面的效率低于 return extra/redundant 信息所花费的时间(在我的示例中,site1.com
是 return编辑了两次)。
OrientDb 或一般的 graph/nosql 数据库可能不是这种情况吗?我是否应该进行两次单独的调用以获取我需要的所有数据,即 SELECT FROM Site WHERE Url = "site1.com"
和 SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com"
?
谢谢
试试这个:
select Url, out("HasPages").title as title from Site unwind title
希望对您有所帮助
此致