Как вернуть конкретную переменную из SPARQL Federated Query (ключевое слово Service)?

Я использую федеративный запрос для получения некоторой информации с удаленного сервера, но я не хочу получать все переменные (выберите *), над которыми я работаю внутри федеративного запроса, я хочу вернуть только переменную count, Как я могу это сделать?

Код:

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 для каждого биологического процесса), как показано на рисунке ниже:

SPARQL объяснение федеративного запроса

Обратите внимание, что в 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, как показано на рисунке ниже:

code> Объясните </ code> подзапрос внутри федеративного запроса Объясните подзапрос внутри федеративного запроса">

Учитывая это, как я могу получить только счет из федеративного запроса?

Извините за длинный пост.

1 ответ

Как и в Использование службы меток Wikidata в федеративных запросах, включите некоторые вещи, которые являются номинально необязательными...

Примечание. Ваш удаленный запрос должен выполняться на удаленной конечной точке, иначе вы получите различные ошибки.

Это запрос, который вы пытаетесь выполнить на конечной точке 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

- но это не из-за синтаксической ошибки; это связано с ZeroOrMorePath rdfs:subClassOf или же owl:someValuesFrom свойства ((rdfs:subClassOf|owl:someValuesFrom)*) Свойство Path вы запрашиваете, который должен попробовать много возможностей.

Если вы ограничите глубину этого пути, конечная точка 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 (который разрешает федеративный 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

- который предполагает, что на сервере Uniprot действуют разные настройки, когда вы проходите непосредственно через форму веб-запроса, которая использует JDBC к их серверу SPARQL, а затем, когда вы идете прямо по HTTP, как с Federated SPARQL.

Я думаю, что решение, которое вам нужно, - это локальное зеркало Uniprot или подключение к общедоступному экземпляру Uniprot, который имеет другие разрешения / настройки, чем основная общедоступная конечная точка.

Другие вопросы по тегам