Pagination SPARQL:在不重复查询的情况下获取一页结果和总结果

Pagination SPARQL:在不重复查询的情况下获取一页结果和总结果,pagination,sparql,Pagination,Sparql,这似乎应该是一件简单/普通的事情,但我还没有找到任何有用的答案 我希望获得一页结果(使用OFFSET和LIMIT)以及同一查询中总结果的COUNT,而无需重复或重新运行查询。换句话说,我想运行一次查询,计算结果,得到偏移量后的前n个结果,然后只返回这n个结果以及总结果计数。如何返回的确切格式并不重要;我只需要数据 我找到的最接近的答案是,但解决方案归结为“在两个子查询中复制WHERE子句”,这似乎是不必要的(并且运行两次查询(?) 我怀疑这可以通过一些子查询的组合和可能的联合来实现,但是我对SP

这似乎应该是一件简单/普通的事情,但我还没有找到任何有用的答案

我希望获得一页结果(使用
OFFSET
LIMIT
)以及同一查询中总结果的
COUNT
,而无需重复或重新运行查询。换句话说,我想运行一次查询,计算结果,得到偏移量后的前n个结果,然后只返回这n个结果以及总结果计数。如何返回的确切格式并不重要;我只需要数据

我找到的最接近的答案是,但解决方案归结为“在两个子查询中复制
WHERE
子句”,这似乎是不必要的(并且运行两次查询(?)

我怀疑这可以通过一些子查询的组合和可能的
联合来实现,但是我对SPARQL是新手,所以我对其语义的理解还不是很牢固

一个明显无效的例子,说明了我想要完成什么(但不是我打算怎么做):

下面两个例子体现了我得到的最接近的结果。首先,给出所需结果集的结果集(在本例中,是一个包含计数的额外结果)。这是基于上面的链接。如上所述,它通过复制
WHERE
子句(有效地运行同一查询两次,除非我误解了SPARQL的工作原理)来实现这一点,我希望避免:

SELECT ?id ?count
WHERE {
    {
        SELECT (COUNT(*) as ?count)
        WHERE {
            ?id some:predicate some:object .
        }
    }
    UNION
    {
        SELECT ?id
        WHERE {
            ?id some:predicate some:object .
        }
        ORDER BY ?id
        OFFSET 5 
        LIMIT 10
    }
}
接下来,一个接近我想要的,但总是返回一个1的
?count
(大概是因为它对分组的
?id
进行计数,而不是对所有匹配项进行计数)。在将
?id
传递到外层以获得
偏移量
限制
ed之前,我试图首先获取(和
计数
)所有匹配项(该部分似乎有效)


(出于此目的和其他目的)能够将
WHERE
子句的结果存储在一个变量中,然后在其上执行两个独立的
SELECT
s(一个用于结果页面,一个用于计数),这将是一件好事,但如果可能的话,我还没有找到一种方法来实现它。

Blazegraph(可能还有AnzoGraph)具体:SPARQL 1.1中没有标准方法-最接近的方法实际上是您在查询2中所做的。但我不明白为什么这个问题会成为一个问题。它是查询优化器的一部分,用于优化这些内容。对于应用程序来说,更好的选择是在单独的查询中获取总计数,您不想计算每个页面的总计数,因为您没有说明要查询的引擎和/或端点。这个细节可能会导致更多的引擎/端点答案…@Talled我们正在使用亚马逊海王星。建议它使用BlazeGraph,但在尝试使用Stanislav上面建议的命名子查询时,我只能得到一个普通的500错误。现在,我决定让我的代码注入查询两次,因为这似乎是最可靠的解决方案。
SELECT ?id ?count
WHERE {
    {
        SELECT (COUNT(*) as ?count)
        WHERE {
            ?id some:predicate some:object .
        }
    }
    UNION
    {
        SELECT ?id
        WHERE {
            ?id some:predicate some:object .
        }
        ORDER BY ?id
        OFFSET 5 
        LIMIT 10
    }
}
SELECT ?id ?count
{
    {
        SELECT ?id (COUNT(*) as ?count)
        WHERE {
            ?id some:predicate some:object .
        }
        GROUP BY ?id
        ORDER BY ?id
    }
}
OFFSET 5
LIMIT 10