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

#sparql #rdf #virtuoso #triplestore

#sparql #rdf #виртуоз #triplestore

Вопрос:

Я загрузил набор троек 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?

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

Ответ №1:

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

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

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

Ответ №2:

Один из способов — использовать 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 .
  }
}
  

Комментарии:

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