OrientDB:获取顶点子查询之间的边

时间:2015-10-07 02:14:19

标签: orientdb

请告知以下内容:

  1. 我只需要在一个顶点(艺术家)和一组顶点(按创建日期排序的文章)之间获得边缘。
  2. 我现在在做什么: 答:比如麦当娜的记录:

    SELECT FROM Artist WHERE title="Madonna" LIMIT 1
    

    B中。要获得关于她的2篇最新文章:

    SELECT expand(in("AboutArtist")[content_type="article"]) FROM Artist WHERE title="Madonna" ORDER BY created DESC LIMIT 2
    

    我使用“content_type”,因为我有两个指向艺术家的节点类型:文章和图库。我只需要文章。

    预期结果:艺术家和关于她的文章之间的边缘数组(按创作日期排序的2篇文章)。

    1. 此外,对于相同的用例,请告知正确的遍历以便将所有内容组合在一起: 麦当娜的记录 和她的2篇文章(根据上面的查询) 和它们之间的边缘
    2. 谢谢! d。

1 个答案:

答案 0 :(得分:1)

在给出答案之前,我会澄清你似乎有的一些误解。

  • 我认为你使用的是常规边缘,而不是轻质边缘?您无法在查询中返回轻量级边缘,因为它没有物理记录。因此,如果您确实需要边缘记录,因为它们本身有一些字段,请确保正确配置数据库。
  • 当您执行expand(in('SomeEdge'))时,它将跟随指向下一条记录的链接。在轻量级边缘的情况下,这将是一个顶点,将返回。在边缘记录的情况下,它将遵循指向下一条记录的out链接(可能是顶点,除非您将边缘链接到边缘),然后返回该记录。因此,如果您想获取边缘记录,则需要使用inE(),而不是in()
  • 继上一点之后,当您有边缘记录时(即使用inE()展开字段),您可以通过名为out的字段/链接转到下一条记录,或者outV()函数(假设边缘只有1个链接,它将返回该1个记录)。您会看到我的答案中使用的out字段。
  • [content_type="article"]正在检查记录中名为'content_type'的字段,这会导致记录被加载(并且可能从结果中丢弃,因此'浪费'加载)。相反,如果您有文章和图库的特定类,则应使用这些类过滤[@class=Article]。我相信OrientDB可以根据作为rid的一部分的集群id推断出类,因此它不必加载记录来过滤它。
  • 除了上一点之外,为什么不为每一个创建一个特定的边缘,即'hasArticle'和'hasGallery',而不是有1个边连接画廊和文章(目前你有“AboutArtist”)?这样您根本不需要过滤记录。

所以这里是获取2篇最新文章边缘的查询。

SELECT expand(inE('AboutArtist')[out.@class='Article'])
FROM Artist
WHERE title="Madonna"
ORDER BY out.created DESC
LIMIT 2

如果您有2位或更多名称为Madonna的艺术家,那么该查询将无法正常运行,因为它将获得所有麦当娜的所有优势,并返回最新的2,这可能不适合麦当娜你真的想要。因此,我将“嵌套”查找Madonna的查询,并将其限制为1(假设它是正确的)。当你这样做时,顺序和限制似乎不起作用,所以你需要嵌套两次。

SELECT
FROM (
    SELECT expand(inE('AboutArtist')[out.@class='Article'])
    FROM (
        SELECT
        FROM Artist
        WHERE title="Madonna"
        LIMIT 1
    )
)
ORDER BY out.created DESC
LIMIT 2

因此,最内部的查询得到了麦当娜,“中间”查询获得麦当娜的边缘,外部查询对这些边缘进行排序和限制。

你的最后一个问题有点困难。遍历1 Madonna,并返回所有边缘和链接顶点非常容易;

TRAVERSE inE('AboutArtist'), out
FROM (
    SELECT FROM Artist WHERE title="Madonna" LIMIT 1
)

这将返回所有AboutArtist边缘以及所有文章和图库。将此限制为我们在上面找到的2条边缘虽然证明有点困难。我找不到一个优雅的解决方案,但我发现了一个。

TRAVERSE in, out
FROM (
    SELECT
    FROM (
        SELECT expand(inE('AboutArtist')[out.@class='Article'])
        FROM (
            SELECT FROM Artist WHERE title="Madonna" LIMIT 1
        )
    )
    ORDER BY out.created DESC
    LIMIT 2
)

我所做的就是嵌套上面的查询找到2条边,然后遍历边的入口和出口链接,从而返回艺术家和2篇文章。结果的顺序与遍历artist-> edge->文章时的顺序不同,但我怀疑顺序是否重要。