OrientDb - 使用图形从多个顶点中选择

问题描述 投票:0回答:1

我刚刚开始使用nosql数据库,特别是OrientDB。我以前的经验是关系数据库,主要是SQL Server。

在MSSQL中,我可以这样做:

SELECT  s.url, p.title
FROM    Site s
JOIN    Page p ON s.Id = p.SiteId

它会给我一张所有页面的表格,以及他们所属网站的网址:

url         |   title
----------------------------
site1.com   |   page1
site1.com   |   page2
site2.com   |   page1

现在,在OrientDb中,我的理解是你应该使用link来实现单向关系,或者使用edge来实现双向关系。由于我想知道哪些页面属于某个站点,以及某个特定页面属于哪个站点,因此我决定在这种情况下使用边缘。 Site和Page类/顶点已经以类似的方式创建,但我无法弄清楚如何获得类似的结果集。从文档(https://orientdb.com/docs/2.2/SQL.html):

OrientDB只允许一个类(这个类相当于本讨论中的表)而不是SQL,它允许许多表作为目标。如果要从2个类中进行选择,则必须执行2个子查询并使用UNIONALL函数将它们连接起来

他们的例子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.urls.id字段,然后第二次调用以获取p.titlep.SiteId字段,然后在应用程序代码中将它们匹配。我避免这种情况的原因是因为多次数据库调用的时间效率低于返回额外/冗余信息所需的时间(在我的示例中,site1.com返回两次)。

对于OrientDb,或者甚至是graph / nosql数据库,这可能不是这种情况吗?我应该做两个单独的调用来获取我需要的所有数据,即SELECT FROM Site WHERE Url = "site1.com"SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com"

谢谢

database nosql orientdb
1个回答
2
投票

试试这个:

select Url, out("HasPages").title as title from Site unwind title

希望能帮助到你

问候

© www.soinside.com 2019 - 2024. All rights reserved.