Уменьшите длину строки запроса sparql с помощью fuseki

Когда я запускаю сервер Fuseki, я использую эту команду:

fuseki-server --config=config-orphadata.ttl

В этом ttl-файле я могу написать несколько правил префикса:

@prefix orphanet: <http://www.orpha.net/ORDO/Orphanet_#> .
@prefix ORDO: <http://www.orpha.net/ORDO/> .

В запросах SPARQL я должен написать все значения префикса, например:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX oboInOwl: <http://www.geneontology.org/formats/oboInOwl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX Orphanet_: <http://www.orpha.net/ORDO/Orphanet_#>
PREFIX ORDO: <http://www.orpha.net/ORDO/>
select ?s ?p ?o ?m ?v ?e WHERE {
?s ?p ?o.
optional {?o ?m ?v. 
?v rdfs:label ?e}.
filter (?s = ORDO:Orphanet_2004)
}
ORDER BY ?o

Если я не пишу префиксы, запрос не работает... Похоже, что префикс правил, определенный в файле конфигурации, может быть недоступен в запросах.

Все элементы, записанные в запросе SPARQL, переходят по URL-адресу GET информации.

Можно ли уменьшить длину строки этого запроса, добавив префикс в файлы конфигурации, чтобы повторно использовать его после запуска моего сервера fuseki?


person Matthieu    schedule 09.04.2014    source источник
comment
На самом деле это не решает вопрос, но в запросах SPARQL синтаксис префикса, например, prefix ex: <http://...>. То, что вы показываете, @prefix ex: <http://...> . используется в Turtle и N3.   -  person Joshua Taylor    schedule 10.04.2014
comment
Да, конечно, я отредактировал свой пост, чтобы быть точным.   -  person Matthieu    schedule 10.04.2014


Ответы (1)


Насколько я знаю, нет поддержки, чтобы сделать это напрямую.

Взлом универсального решения

Мне еще предстоит найти место, где я могу изменить префиксы, используемые ARQ при разборе запросов, но это не значит, что его не существует. Мое предложение, если вы хотите продолжить это, будет заключаться в том, чтобы копаться в GrepCode, пока вы не найдете место, где вы можете заменить фабрику/распознаватель по умолчанию, а затем написать код, который используется для этого, в инициализатор static некоторого пользовательского класса. ваш. Потенциально это может быть эпично-грязным, поэтому вам может не стоить этого делать.

Запустите Fuseki с вашим новым классом (org.ididhax.ChangePrefixes) где-нибудь в пути к классам и поместите [] ja:loadClass "org.ididhax.ChangePrefixes" в файл ассемблера Fuseki. Это заставит Fuseki загрузить ваш класс, который изменит доступные префиксы.

Интернет-обход/взлом

Если вы используете Fuseki из веб-интерфейса, обновите шаблоны, которые Fuseki использует для веб-форм, чтобы прикрепить некоторый набор префиксов по умолчанию к любому отправляемому вами запросу. Тогда SPARQL, который анализирует Fuseki, будет действительным.

Обходной путь для Java / лайфхак №1

Это обходной путь, который я иногда использую. В любом случае, я создаю 99% своих запросов программно. Что вы делаете, так это создаете PrefixMappingImpl и загрузите туда свои любимые префиксы. Создайте код, который возьмет нужную строку SPARQL и добавит к ней эти префиксы в правильном формате. Тогда остальная часть вашего кода не волнует.

/* 'MyQueryFactory' hides the appending of your prefixes and the call to
 * the actual Jena 'QueryFactory'
 */
final String mySparqlString = "SELECT * WHERE { ?bob rdf:type vocab:Cat }";
final Query query = MyQueryFactory.create(mySparqlString);

Обходной путь Java / прием № 2

Часто это мои личные предпочтения. Если у вас есть Jena Schemagen словари класса Java для ваших терминов, не используйте префиксы вообще. Статически замените поля из этих словарей и создайте SPARQL, используя точные термины. Вы никогда лично не увидите ни одного URI, и это может быть удобно, если вы потенциально меняете свой словарь (может привести к удобным ошибкам компиляции везде, где вы используете термин, которого больше не существует). Ниже приведен пример:

final Query query = QueryFactory.create(
  "SELECT * WHERE {\n"+
  " ?bob <"+RDF.type+"> <"+MyVocab.Cat+"> .\n"+
  "}");
person Rob Hall    schedule 24.04.2014
comment
Если вы подключаетесь к fuseki с помощью apache httpd, вы можете сделать что-то вроде хакерства с URL-адресом в proxypass. Что-то вроде proxypass /foo /fuseki/blah/query=ENCODED_VERSION_OF_PREFIXES - person Dan Pritts; 14.06.2018