Запросить отдельные списки различных переменных в SPARQL? - PullRequest
0 голосов
/ 05 марта 2020

Скажем, у меня такой запрос:

WHERE {
<http://purl.uniprot.org/uniprot/Q8NAT1> up:classifiedWith ?annotation .
?protein up:classifiedWith ?annotation .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?O3OET.
    ?O3OET a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?Q02UJ .
    ?protein a up:Protein .
    ?protein up:annotation ?otherTop .
    ?otherTop a up:Topological_Domain_Annotation;
             rdfs:comment ?topology;
             up:range ?OTHERRANGE .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?S7IK0.
    ?S7IK0 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
    ?protein a up:Protein .
    ?protein up:annotation ?VAR2 .
    ?VAR2 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
<http://purl.uniprot.org/uniprot/Q8NAT1> up:citation ?citation .
?protein up:citation ?citation .
}
GROUP BY ?protein

Где я пытаюсь запросить уникальные экземпляры каждой переменной, без полного декартового продукта, как это обычно делает SPARQL. Теперь я хочу получить список из всех различных совпадений переменных для каждой запрашиваемой переменной.

ie., Если имеется 10 различных белков и 2 разные аннотации, как мне получить эти результаты? ? Нужно ли делать отдельные запросы?

1 Ответ

1 голос
/ 05 марта 2020

Существует несколько возможных подходов к этому.

Использование CONSTRUCT запроса

При выборе множества различных переменных вы получите «декартов» результат, потому что вы представляете несколько паттернов совпадения в виде табличной структуры: каждое немного отличающееся совпадение получает свою собственную «строку» в результате. Запрос CONSTRUCT не возвращает табличную структуру, но возвращает подграф, который соответствует вашим данным. Предполагая, что вы используете библиотеку, которая имеет неплохую поддержку для обхода графа RDF, это на самом деле может быть проще и более естественным для обработки, чем сложный запрос SELECT.

Использование GROUP_CONCAT

Вы можете используйте агрегатный оператор GROUP_CONCAT для получения результата, в котором несколько значений переменной объединяются в одну строку. Например, если у вас ранее было это:

  SELECT ?protein ?annotation
   ....

и вы получили что-то вроде этого:

protein1 annotation1
protein1 annotation2
protein2 annotation3
protein2 annotation4
...

, вы можете использовать это вместо:

SELECT ?protein (GROUP_CONCAT(?annotation) as ?annotations)

и ваш результат будет выглядеть следующим образом:

protein1 "annotation1 annotation2"
protein2 "annotation3 annotation4"

использовать несколько запросов

Другой вариант - использовать несколько запросов: первый запрос просто извлекает идентификаторы ресурса (белки, в вашем случае) , Затем вы перебираете результат и для каждого идентификатора ресурса выполняете дополнительный запрос, который получает дополнительные атрибуты, представляющие интерес для этого конкретного ресурса.

...