【问题标题】:How to return specific variable from SPARQL Federated Query (Service keyword)?如何从 SPARQL 联合查询(服务关键字)返回特定变量?
【发布时间】:2018-11-12 22:37:36
【问题描述】:

我正在使用联合查询从远程服务器检索一些信息,但我不想检索我在联合查询中处理的所有变量(选择 *),我只想返回计数变量。我该怎么做?

代码:

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替换,如下图所示:

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

抱歉,帖子太长了。

【问题讨论】:

  • 您的数据集中有多少个进程? Uniprot本体有多少个进程?
  • 我认为长帖不是问题,但我建议修改/扩展问题应该是一个新问题——因为它与它“编辑”的问题有很大不同。跨度>

标签: sparql jena arq federated-queries


【解决方案1】:

Using Wikidata label service in federated queries一样,包括一些名义上可选的东西......

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

这是您尝试在 Uniprot endpoint 上运行的查询 --

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:subClassOfowl:someValuesFrom 属性((rdfs:subClassOf|owl:someValuesFrom)*) 属性路径的ZeroOrMorePath,它必须尝试多种可能性。

如果您限制该路径的深度,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 查询表单(使用 JDBC 针对他们的 SPARQL 服务器)以及当您直接通过 HTTP 时(如使用 Federated SPARQL)时,Uniprot 服务器上的不同设置正在发挥作用。

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

【讨论】:

  • 谢谢 TallTed,您的解释让我明白了一些我不知道的事情。不幸的是,它并没有解决我的问题,但我认为这是我的解释,因为我试图让问题保持简单并且我跳过了一些细节。我用完成的情况编辑了原始帖子。无论如何,谢谢,这很有帮助! :-D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多