У меня есть следующий федеративный запрос SPARQL, который работает должным образом в TopBraid Composer Free Edition (версия 5.1.4), но не работает в Apache Fuseki (версия 2.3.1):
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dcterms: <http://purl.org/dc/terms/>
SELECT ?s WHERE {
SERVICE <http://data.linkedmdb.org/sparql> {
<http://data.linkedmdb.org/resource/film/1> movie:actor ?actor .
?actor movie:actor_name ?actorName .
}
SERVICE <http://dbpedia.org/sparql?timeout=30000> {
?s ?p ?o .
FILTER(regex(str(?s), replace(?actorName, " ", "_"))) .
}
}
Я слежу за подзапросами SPARQL, которые выполняются под капотом, и замечаю, что TopBraid правильно выполняет следующий запрос к http://dbpedia.org/sparql:
SELECT *
WHERE
{ ?s ?p ?o
FILTER regex(str(?s), replace("Paul Reubens", " ", "_"))
}
в то время как Apache Fuseki выполняет следующий подзапрос:
SELECT *
WHERE
{ ?s ?p ?o
FILTER regex(str(?s), replace(?actorName, " ", "_"))
}
Обратите внимание на разницу; TopBraid заменяет переменную ?actorName на конкретное значение Paul Reubens, а Apache Fuseki этого не делает. Это приводит к ошибке конечной точки http://dbpedia.org/sparql, поскольку в набор результатов, но не назначен.
Это ошибка в Apache Fuseki или функция в TopBraid? Как я могу заставить Apache Fuseki правильно выполнять этот федеративный запрос.
обновление 1: чтобы немного подробнее прояснить разницу в поведении TopBraid и Apache Fuseki. TopBraid сначала выполняет подзапрос connectedmdb.org, а затем выполняет подзапрос dbpedia.org для каждого результата запроса connectedmdb.org) (и заменяет имя исполнителя на результаты запроса connectedmdb.org). Я предположил, что Apache Fuseki ведет себя аналогичным образом, но первый подзапрос к dbpedia.org завершился ошибкой (потому что в результирующем наборе используется, но не назначается имя исполнителя), и поэтому он не продолжается. Но теперь я не уверен, действительно ли он хочет выполнить подзапрос к dbpedia.org несколько раз, потому что он никогда не попадает туда.
обновление 2: я думаю, что и TopBraid, и Apache Fuseki используют Jena / ARQ, но я заметил, что в трассировках стека из TopBraid имя пакета выглядит примерно как com.topbraid.jena. *, что может означать, что они используют модифицированная версия Jena / ARQ?
обновление 3: Джошуа Тейлор говорит ниже: «Разве вы не ожидаете, что второй служебный блок будет выполняться для каждого из них?». И TopBraid, и Apache Fuseki используют именно этот метод для следующего запроса:
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dcterms: <http://purl.org/dc/terms/>
SELECT ?film ?label ?subject WHERE {
SERVICE <http://data.linkedmdb.org/sparql> {
?film a movie:film .
?film rdfs:label ?label .
?film owl:sameAs ?dbpediaLink
FILTER(regex(str(?dbpediaLink), "dbpedia", "i"))
}
SERVICE <http://dbpedia.org/sparql> {
?dbpediaLink dcterms:subject ?subject
}
}
LIMIT 50
но я согласен с тем, что в принципе они должны выполнить обе части один раз и присоединиться к ним, но, может быть, из соображений производительности они выбрали другую стратегию?
Кроме того, обратите внимание, как указанный выше запрос работает в Apache Fuseki, а первый запрос этого сообщения - нет. Итак, в данном конкретном случае Apache Fuseki ведет себя аналогично TopBraid. Похоже, это связано с использованием переменной URI (? DbpediaLink) в двух тройных шаблонах (которая работает в Fuseki) по сравнению с использованием переменной String (? тройной шаблон в функции регулярного выражения FILTER (который не работает в Fuseki).
timeout
в URL-адресе конечной точки? - person scotthenninger   schedule 12.07.2016?s ?p ?o
запрос с таймаутом, который произвольно прерывает выполнение, не является хорошим выбором.LIMIT
было бы лучше, а сокращение запроса до определенных членов класса DBPedia было бы еще лучше - person scotthenninger   schedule 12.07.2016