Наилучшая практика для объединения неуказанных c запросов SPARQL? - PullRequest
0 голосов
/ 16 января 2020

Я пишу некоторый код python для динамического построения запроса SPARQL произвольной длины.

У меня есть подзапрос, который выглядит следующим образом:

                ?topObj a up:Topological_Domain_Annotation;
                         rdfs:comment '{}';
                         up:range ?range.

                 ?proteins a up:Protein .
                 ?proteins up:annotation ?otherTop .
                 ?otherTop a up:Topological_Domain_Annotation;
                           rdfs:comment '{}';
                           up:range ?otherRange.""",

Где я go в и .format () {} в зависимости от заданного пользователем ввода. Мне нужен способ собрать несколько таких подзапросов, которые потенциально могут соответствовать другим объектам, ie. линия rdfs:comment '{}';. Но, конечно, имена переменных, которые я использую для перехода к желаемому объекту, связаны в первом подзапросе.

Было бы наилучшим решением:

  • Генерация случайных переменных для хранения пройденных узлов для каждого мини-запроса
  • Использовать какой-нибудь трюк пути свойства / пустой узел, о котором я не знаю?

РЕДАКТИРОВАТЬ:

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

SELECT DISTINCT ?proteins
WHERE {
    <http://purl.uniprot.org/uniprot/P04439> up:annotation ?1WGQM.
    ?1WGQM a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?VLIT1 .
    <http://purl.uniprot.org/uniprot/P01911> up:annotation ?FIICT.
    ?FIICT a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?W89B2 .
    <http://purl.uniprot.org/uniprot/P10321> up:annotation ?WU6G3.
    ?WU6G3 a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?ZSIQ3 .
    ?proteins a up:Protein .
    ?proteins up:annotation ?otherTop .
    ?otherTop a up:Topological_Domain_Annotation;
             rdfs:comment ?topology;
             up:range ?OTHERRANGE .
}
LIMIT 10

1 Ответ

1 голос
/ 17 января 2020

Просто используйте BNodes вместо генерации уникальных имен для этих переменных, например, что-то вроде этих строк:

SELECT DISTINCT ?proteins
WHERE {
    <http://purl.uniprot.org/uniprot/P04439> up:annotation [
        a up:Topological_Domain_Annotation;
        rdfs:comment ?topology;
        up:range [] 
    ].
    <http://purl.uniprot.org/uniprot/P01911> up:annotation [
        a up:Topological_Domain_Annotation;
        rdfs:comment ?topology;
        up:range []
    ] .
    <http://purl.uniprot.org/uniprot/P10321> up:annotation [
        a up:Topological_Domain_Annotation;
        rdfs:comment ?topology;
        up:range [] 
    ].

    ?proteins a up:Protein .
    ?proteins up:annotation [
            a up:Topological_Domain_Annotation;
            rdfs:comment ?topology;
            up:range [] 
        ].
}
LIMIT 10

HTH

...