[英]How to return specific variable from SPARQL Federated Query (Service keyword)?
我正在使用联合查询从远程服务器检索一些信息,但我不想检索我在联合查询中处理的所有变量(选择 *),我只想返回计数变量. 我怎样才能做到这一点?
代码:
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
图像中,联合查询选择了所有内容 (*) 但问题是我不想检索我在联合查询中处理的所有这些关系,我只想检索计数但count 是一个聚合函数,只允许放在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 替换,如下图所示:
考虑到这一点,如何仅从联合查询中检索计数?
抱歉,帖子太长了。
就像在联合查询中使用维基数据标签服务一样,包括一些名义上可选的东西......
注意——你的远程查询必须在远程端点上实际执行,否则你会得到不同的错误。
这是您尝试在Uniprot 端点上运行的查询——
PREFIX up: <http://purl.uniprot.org/core/>
PREFIX taxon: <http://purl.uniprot.org/taxonomy/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT (COUNT(DISTINCT ?protein) AS ?count)
WHERE
{
?sub_bp (rdfs:subClassOf|owl:someValuesFrom)* ?bp_iri .
?protein up:classifiedWith ?sub_bp .
?protein up:organism taxon:10090 .
}
那得到一个错误-
查询评估异常。
: SPARQL execute failed:[PREFIX up: PREFIX taxon: PREFIX rdfs: PREFIX owl: SELECT (COUNT(DISTINCT ?protein) AS ?count) WHERE { ?sub_bp (rdfs:subClassOf|owl:someValuesFrom)* ?bp_iri . ?protein up:classifiedWith ?sub_bp . ?protein up:organism taxon:10090 . }] Exception:virtuoso.jdbc4.VirtuosoException: TN...: Exceeded 1000000000 bytes in transitive temp memory. use t_distinct, t_max or more T_MAX_memory options to limit the search or increase the pool
-- 但这不是由于语法错误; 这是由于rdfs:subClassOf
或owl:someValuesFrom
属性的owl:someValuesFrom
( (rdfs:subClassOf|owl:someValuesFrom)*
) 您正在查询的属性路径,必须尝试多种可能性。
如果您限制该路径的深度,Uniprot 端点可以处理它,并且您可以通过 Federated SPARQL 运行它。
这是一个减少深度的查询(我随意尝试了 3 个“ZeroOrOnePath”)——
PREFIX up: <http://purl.uniprot.org/core/>
PREFIX taxon: <http://purl.uniprot.org/taxonomy/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT (COUNT(DISTINCT ?protein) AS ?count)
WHERE
{
?sub_bp (rdfs:subClassOf|owl:someValuesFrom)?
/ (rdfs:subClassOf|owl:someValuesFrom)?
/ (rdfs:subClassOf|owl:someValuesFrom)? ?bp_iri .
?protein up:classifiedWith ?sub_bp .
?protein up:organism <http://purl.uniprot.org/taxonomy/10090> .
}
——有结果了——
count
"77633"xsd:int
-- 我发现在一个级别上都是相同的结果 --
PREFIX up: <http://purl.uniprot.org/core/>
PREFIX taxon: <http://purl.uniprot.org/taxonomy/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT (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> .
}
我刚刚通过 URIBurner.com 运行了这个查询(它允许经过身份验证的用户使用 Federated SPARQL)——
PREFIX up: <http://purl.uniprot.org/core/>
PREFIX taxon: <http://purl.uniprot.org/taxonomy/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT *
WHERE
{
SERVICE <https://sparql.uniprot.org/sparql>
{
SELECT (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> .
}
}
}
那仍然会产生错误-
Virtuoso HTCLI 错误 HC001:HTTP 客户端读取错误
-- 这表明当您直接通过他们的 Web 查询表单时,Uniprot 服务器上正在使用不同的设置,该表单使用 JDBC 针对他们的 SPARQL 服务器,然后当您直接通过 HTTP 时,就像使用 Federated SPARQL 一样。
我认为您需要的解决方案是本地 Uniprot 镜像,或者连接到具有与主要公共端点不同的权限/设置的公共 Uniprot 实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.