Как извлечь тройки RDF с определенными предикатами с помощью sparql

Я загрузил набор троек RDF на локальную конечную точку Virtuoso.

Из всех этих троек я хотел бы выделить только те, у субъектов которых есть хотя бы предикаты http://www.w3.org/2000/01/rdf-schema#label и http://www.w3.org/2000/01/rdf-schema#comment.

Например, из этих троек:

<http://dbpedia.org/resource/AccessibleComputing> <http://www.w3.org/2000/01/rdf-schema#label> "AccessibleComputing"@en .
<http://dbpedia.org/resource/AfghanistanGeography> <http://www.w3.org/2000/01/rdf-schema#label> "AfghanistanGeography"@en .
<http://dbpedia.org/resource/AfghanistanGeography> <http://www.w3.org/2000/01/rdf-schema#comment> " ... " .
<http://dbpedia.org/resource/Austroasiatic_languages> <http://www.w3.org/2000/01/rdf-schema#comment> " ... " .
<http://dbpedia.org/resource/AccessibleComputing> <http://dbpedia.org/ontology/wikiPageWikiLink> <http://dbpedia.org/resource/Computer_accessibility> .
<http://dbpedia.org/resource/AfghanistanGeography> <http://dbpedia.org/ontology/wikiPageWikiLink> <http://dbpedia.org/resource/Afghanistan_Geography> .

Я бы хотел получить:

<http://dbpedia.org/resource/AfghanistanGeography> <http://www.w3.org/2000/01/rdf-schema#label> "AfghanistanGeography"@en .
<http://dbpedia.org/resource/AfghanistanGeography> <http://www.w3.org/2000/01/rdf-schema#comment> " ... " .
<http://dbpedia.org/resource/AfghanistanGeography> <http://dbpedia.org/ontology/wikiPageWikiLink> <http://dbpedia.org/resource/Afghanistan_Geography> .

Можно ли сделать это с помощью одного (или нескольких) запросов SPARQL?

Спасибо за помощь


person Furabio JZ4    schedule 24.04.2019    source источник


Ответы (2)


Это можно сделать с помощью CONSTRUCT WHERE запроса:

CONSTRUCT WHERE {
    ?s rdfs:label ?label.
    ?s rdfs:comment ?comment.
    ?s ?p ?o
}

Это упрощенная форма CONSTRUCT, которая может использоваться, когда часть CONSTRUCT {} и часть WHERE {} идентичны.

person cygri    schedule 24.04.2019

Один из способов - использовать DESCRIBE, например:

DESCRIBE ?s 
WHERE {
  ?s rdfs:label ?label .
  ?s rdfs:comment ?comment .
}

или альтернативно с CONSTRUCT:

CONSTRUCT { ?subject ?predicate ?object} 
WHERE {
  ?subject ?predicate ?object .
  FILTER EXISTS {
     ?subject rdfs:label ?label .
     ?subject rdfs:comment ?comment .
  }
}
person Damyan Ognyanov    schedule 24.04.2019
comment
Поведение DESCRIBE зависит от хранилища SPARQL и может включать лишние тройки, которые нежелательны, или пропускать тройки, которые требуются. Поэтому, в зависимости от используемого магазина, это может быть не лучший выбор. - person cygri; 24.04.2019