代码之家  ›  专栏  ›  技术社区  ›  Russell Uhl

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

  •  0
  • Russell Uhl  · 技术社区  · 6 年前

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

    在MSSQL中,我可以执行以下操作:

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

    它会给我一个包含所有页面的表格,以及它们所属网站的url:

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

    现在,在OrientDb中,我的理解是您应该使用 link 对于单向关系,或 edge 用于双向关系。因为我想知道哪些页面属于某个站点,以及某个特定页面属于哪个站点,所以我决定在本例中使用edge。站点和页面类/顶点已经以类似的方式创建,但我不知道如何获得类似的结果集。从文档中( https://orientdb.com/docs/2.2/SQL.html ):

    OrientDB只允许一个类(类与中的表等效 与SQL相反,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.url s.id 字段,然后再次调用以获取 p.title p.SiteId 字段,然后在应用程序代码中对其进行匹配。我之所以避免这样做,是因为多个数据库调用在时间上比返回额外/冗余信息所需的时间效率低(在我的示例中, site1.com 返回两次)。

    对于OrientDb,甚至图形/nosql数据库,通常情况下都不是这样吗?我应该打两个单独的电话来获取我需要的所有数据吗。 SELECT FROM Site WHERE Url = "site1.com" 以及 SELECT EXPAND(OUT("HasPages")) FROM Site WHERE Name = "site1.com" ?

    非常感谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Michela Bonizzi    6 年前

    尝试以下操作:

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

    希望有帮助

    当做