Построить граф RDF по федеративному запросу?

Я новичок в SPARQL и RDF. По сути, мне нужно разработать федеративный запрос SPARQL 1.1 для Wikidata и Dbpedia.

Вот мой простой вопрос. Здесь будут выбраны фильмы с участием Леонардо Ди Каприо в главной роли.

PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbr: <http://dbpedia.org/resource/> 
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?film WHERE {
  {
    SELECT ?film WHERE {
        ?film  wdt:P161 wd:Q38111.
    }
  }
  UNION 
  {
    SELECT ?film WHERE {
       ?film rdf:type dbo:Film .
       ?film dbo:starring dbr:Leonardo_DiCaprio .
    }
  }
}

Я должен построить график на основе этого. Может ли кто-нибудь помочь мне с таким запросом? Тестирую на Apache Jena.


person Aziz Mumtaz    schedule 29.05.2018    source источник
comment
Для федеративного запроса вам понадобится ключевое слово SERVICE. Так как вы тоже хотите троек, вам нужно объединить это с CONSTRUCT   -  person UninformedUser    schedule 29.05.2018
comment
С другой стороны, я не вижу необходимости в федеративном запросе в вашем примере. Что плохого в том, чтобы просто выполнить два запроса: один по DBpedia, а другой по Викиданным? Тем более, что ваш пример будет пытаться присоединиться к разным URI, привязанным к переменной ?film   -  person UninformedUser    schedule 29.05.2018
comment
@AKSW, моя задача - использовать 1.0 sparql, поэтому я должен пропустить эту службу. Хотя в запросе я допустил небольшую ошибку. Мне нужно будет его изменить.   -  person Aziz Mumtaz    schedule 29.05.2018
comment
SPARQL 1.0 не поддерживает ни объединенные запросы, ни подзапросы, которые вы использовали в запросе. Выполните два отдельных CONSTRUCT запроса для каждой базы знаний, затем объедините тройки. Это все   -  person UninformedUser    schedule 30.05.2018
comment
Кстати, в своем вопросе вы сказали, что мне нужно разработать федеративный запрос SPARQL 1.1 для Wikidata и Dbpedia. - теперь вы говорите, что хотите использовать SPARQL 1.0 < / b> ...   -  person UninformedUser    schedule 30.05.2018
comment
Похоже на домашнее задание ... и похоже на запрос федерации в Dbpedia и Wikidata.   -  person TallTed    schedule 08.06.2018


Ответы (1)


В SPARQL SELECT запросы дадут вам ответ, оформленный в виде таблицы.

Чтобы получить тройки, вам нужно использовать CONSTRUCT запрос и, следовательно, построить по ним граф.

Получив ответ на запрос CONSTRUCT, вам просто нужно добавить оператор в график.

Graph graph = GraphFactory.createDefaultGraph(); // Create an empty graph

String queryString = "CONSTRUCT { ?s ?p ?o } WHERE ..."

// ... Depends on which way you want to query the dataset
QueryExecution qexec = QueryExecutionFactory.create(queryString, ...) 

Iterator<Triple> triples = qexec.execConstructTriples();

while(triples.hasnext()){
  graph.add(triples.next())
}
person Gilles-Antoine Nys    schedule 29.05.2018