首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从SPARQL联邦查询(Service关键字)返回特定变量?

如何从SPARQL联邦查询(Service关键字)返回特定变量?
EN

Stack Overflow用户
提问于 2018-11-12 22:37:36
回答 1查看 266关注 0票数 2

我使用联邦查询从远程服务器检索一些信息,但我不想检索联邦查询中正在处理的所有变量(select *),我只想返回count变量。我怎么能这么做?

代码:

代码语言:javascript
复制
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> .
}

如果不是联邦查询,我会这样做:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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在请求时被特定的生物进程IRI (每个生物进程一个HTTP请求)替换,如下图所示:

注意,在explain映像中,联邦查询选择了所有(*),但问题是,我不想检索在联邦查询中处理的所有这些关系,我只想检索计数,但计数是一个累加函数,只允许放在SELECT关键字前面。(我不想检索所有的关系,因为这些查询返回了很多三倍(按几万,有时是毫升),在我的计算机中不需要仅仅计算它们。

为了解决这个问题,我尝试在联邦查询中创建一个子查询,只选择计数(?bp_total),而不是所有的三元组。所用代码:

代码语言:javascript
复制
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替换,如下图所示:

考虑到这一点,我如何才能从联邦查询中只检索计数?

很抱歉有这么长的邮筒。

EN

回答 1

Stack Overflow用户

发布于 2018-11-13 03:48:08

在联合查询中使用Wikidata label服务中,包括一些名义上可选的东西.

注意--您的远程查询必须在远程端点上实际执行,否则您将得到不同的错误。

这是您试图在Uniprot端点上运行的查询--

代码语言:javascript
复制
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

-但这并不是因为语法错误,而是因为您正在查询的ZeroOrMorePath of rdfs:subClassOfowl:someValuesFrom properties ((rdfs:subClassOf|owl:someValuesFrom)*)属性路径,这需要尝试许多可能性。

如果限制了路径的深度,Uniprot端点可以处理它,并且可以通过Federated运行它。

下面是一个简化的深度查询(我用3“ZeroOrOnePath”任意尝试) --

代码语言:javascript
复制
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> .
  }

-这有结果--

代码语言:javascript
复制
count
"77633"xsd:int

--我发现结果是一样的--

代码语言:javascript
复制
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运行了这个查询(它允许联邦SPARQL对经过身份验证的用户) --

代码语言:javascript
复制
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错误HC001: HTCLI中的读取错误

--这意味着当您直接通过Uniprot服务器的web查询表单时,在Uniprot服务器上使用不同的设置,对SPARQL服务器使用JDBC,然后直接通过HTTP,就像联邦SPARQL一样。

我认为您需要的解决方案是本地Uniprot镜像,或者连接到与主公共端点具有不同权限/设置的公共Uniprot实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53271110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档