我正在使用联合查询从远程服务器检索一些信息,但我不想检索我在联合查询中处理的所有变量(选择 *),我只想返回计数变量. 我怎样才能做到这一点?
代码:
SERVICE <https://sparql.uniprot.org/sparql/> {
?sub_bp (rdfs:subClassOf|owl:someValuesFrom)* ?bp_iri .
?protein up:classifiedWith ?sub_bp.
?protein up:organism <http://purl.uniprot.org/taxonomy/10090> .
}
如果不是联合查询,我会这样做:
SELECT distinct (count(distinct ?protein) as ?count) WHERE {
?sub_bp (rdfs:subClassOf|owl:someValuesFrom)* ?bp_iri .
?protein up:classifiedWith ?sub_bp.
?protein up:organism <http://purl.uniprot.org/taxonomy/10090> .
}
但是在联合查询中我无法选择变量,那么有没有办法做我想做的事?
** 编辑 1 **
在@TallTed 回复之后,我注意到我可能跳过了一些细节以使问题变得简单,但事实证明细节很重要,所以我将描述整个情况。
我有一个本地数据集,其中包含有关生物过程和基因的三元组。我必须计算与每个生物过程相关的基因数量,并将该数字除以 Uniprot 中确定的关于相同生物过程(及其“子代”)的蛋白质总数。
为此,我首先查询我的本地数据集,计算每个生物过程的基因,然后运行联合查询来计算 Uniprot 中每个生物过程(及其“子代”)中所有已识别的蛋白质。
完整的 SPARQL 代码:
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX uniprot: <http://purl.uniprot.org/core/>
PREFIX up:<http://purl.uniprot.org/core/>
PREFIX owl:<http://www.w3.org/2002/07/owl#>
SELECT DISTINCT ?bp_iri ?bp_count (count(distinct ?protein) as ?bp_total) ((?bp_count / ?bp_total) as ?divided) WHERE {
{
SELECT DISTINCT ?bp_iri (COUNT(?bp_iri) as ?bp_count) WHERE{
?genes_iri a uniprot:Gene .
?genes_iri obo:RO_0000056 ?bp_iri .
}group by ?bp_iri order by DESC(?bp_count)
}
SERVICE silent <https://sparql.uniprot.org/sparql/> {
?sub_bp (rdfs:subClassOf|owl:someValuesFrom)* ?bp_iri .
?protein up:classifiedWith ?sub_bp.
?protein up:organism <http://purl.uniprot.org/taxonomy/10090> .
}
}group by ?bp_iri ?bp_count ?bp_total order by DESC(?divided)
当我使用 Jena ARQ(一个查询引擎)运行这个查询时,变量?bp_iri
在 HTTP 请求的时刻被一个特定的生物过程 IRI(每个生物过程一个 HTTP 请求)替换,如下图所示:
请注意,在explain
图像中,联合查询正在选择所有内容 (*),但问题是我不想检索我在联合查询中处理的所有这些关系,我只想检索计数但计数是一个聚合函数,只允许放在SELECT
关键字前面。(我不想检索所有的关系,因为这些查询返回了很多三元组(数万,有时是数百万),并且没有必要将它们放在我的计算机中只是为了计数。)
为了解决这个问题,我尝试在联合查询中创建一个子查询,以仅选择计数 ( ?bp_total
) 而不是所有三元组。使用的代码:
SERVICE silent <https://sparql.uniprot.org/sparql/> {
{
SELECT (count(distinct ?protein) as ?bp_total) WHERE {
?sub_bp (rdfs:subClassOf|owl:someValuesFrom)* ?bp_iri .
?protein up:classifiedWith ?sub_bp.
?protein up:organism <http://purl.uniprot.org/taxonomy/10090> .
}
}
}
再次运行explain
,我注意到当我在联邦查询中放置一个子查询时,变量?bp_iri
并没有被生物过程 IRI 替换,如下图所示:
考虑到这一点,我怎样才能只从联合查询中检索计数?
对不起,很长的帖子。