2015-03-02 7 views
2

Я пытаюсь использовать федеративные запросы с Jena через конечную точку Fuseki. С ключевым словом SERVICE в моем запросе SPARQL я подключаюсь к конечной точке Stardog. Поскольку это защищенный URL, конечная точка указывается следующим образом: http://admin:[email protected]. Поскольку это не является безопасным, Jena показывает следующее сообщение:Федеративный запрос с защищенной конечной точкой SPARQL

Code: 36/HAS_PASSWORD in USER: Including passwords in URIs is deprecated. 

В соответствии с docs, вы можете указать SRV: queryAuthUser и SRV: queryAuthPwd учетные данные. Есть ли способ сделать это непосредственно в запросе SPARQL? Или, может ли он быть настроен в Fuseki (файл ttl)?

EDIT

Когда я использую @ решения RobV, в контексте службы, кажется, не будет услышан. Это то, что контекст выглядит следующим образом:

symbol:http://jena.hpl.hp.com/ARQ#regexImpl = symbol:http://jena.hpl.hp.com/ARQ#javaRegex 
symbol:http://jena.hpl.hp.com/ARQ#constantBNodeLabels = true 
symbol:http://jena.hpl.hp.com/ARQ#strictGraph = false 
symbol:http://jena.hpl.hp.com/ARQ#strictSPARQL = false 
symbol:http://jena.hpl.hp.com/ARQ#stageGenerator = [email protected] 
symbol:http://jena.hpl.hp.com/ARQ#enablePropertyFunctions = true 
symbol:http://jena.hpl.hp.com/ARQ#romanNumerals = false 
symbol:http://jena.hpl.hp.com/ARQ#optFilterPlacement = false 
symbol:http://jena.hpl.hp.com/ARQ#registryPropertyFunctions = [email protected]41 
symbol:http://jena.hpl.hp.com/ARQ/system#opExecutorFactory = [email protected] 

Когда я покину конфигурацию фусеки, как есть, и добавить контекст службы в моей бизнес-уровне, контекст службы, похоже, будет добавлен:

symbol:http://jena.hpl.hp.com/Service#serviceContext = {http://host:5820/db/query=symbol:http://jena.hpl.hp.com/Service#queryAuthPwd = usr 
symbol:http://jena.hpl.hp.com/Service#queryAuthUser = pwd} 

В то же время я все еще получаю несанкционированное сообщение, когда выполняю федеративный запрос. не

+0

Как в стороне, Stardog 3 будет поддерживать ключевое слово SERVICE, которое может облегчить вам задачу. – Michael

+0

Да, это было бы хорошо. Еще 2 недели и Stardog 3 должны быть вне. – tstorms

ответ

2

Нет нет никакого способа сделать это непосредственно в запросе SPARQL

В теории можно использовать ja:context свойство в конфигурационном файле фусеките указать свойство контекста. Однако на практике это не работает, потому что контекст службы представляет собой вложенный контекст, и ассемблер в настоящее время не поддерживает вложенные контексты.

Однако вместо этого вы можете использовать механизм ja:loadClass для загрузки пользовательского класса, который вы добавляете к пути класса, который выполняет необходимую статическую инициализацию, например.

[] rdf:type fuseki:Server ; 
    ja:loadClass "com.example.YourInitializer" ; 
    fuseki:services (
    # Whatever services you are defining 
    ) . 

Обратите внимание, что вы MUST ассоциировать ваш инициализатора с субъектом, который представляет fuseki:Server экземпляр иначе ja:loadClass тройная не может обрабатываться.

И потом:

package org.apache.jena.playground; 

import java.util.HashMap; 
import java.util.Map; 

import com.hp.hpl.jena.query.ARQ; 
import com.hp.hpl.jena.sparql.engine.http.Service; 
import com.hp.hpl.jena.sparql.util.Context; 

public class StardogInitializer { 

    public static void init() { 
     // Prepare Stardog specific context 
     Context stardogContext = new Context(); 
     stardogContext.set(Service.queryAuthUser, "admin"); 
     stardogContext.set(Service.queryAuthPwd, "admin"); 

     // Associate context with your endpoint URL 
     Map<String, Context> serviceContexts = new HashMap<>(); 
     // temp here is the name of the Stardog database to be queried 
     serviceContexts.put("http://localhost:5820/temp/query", stardogContext); 

     // Associate service contexts with the global ARQ context 
     ARQ.getContext().set(Service.serviceContext, serviceContexts); 
    } 
} 

Обратите внимание, что метод должен быть статическим и должен быть вызван init() для того, чтобы фусеки, чтобы вызвать его.

С этой измененной настройкой мне удалось успешно запросить мой локальный сервер Stardog.

+0

Я все еще получаю сообщение _Проблема доступа/ds/query. Причина: Unauthorized_. Возможно, в моем [файле конфигурации Fuseki] есть ошибка (https://gist.github.com/TimmyStorms/bc2014756dcec8b6b814). Я проверил, что пользовательский инициализатор загружается. Имейте в виду, что я хотел бы запросить TDB и Stardog одновременно с использованием SERVICE. – tstorms

+0

Я отредактировал свой вопрос. Вы можете проверить это? – tstorms

+0

Можете ли вы попытаться явно связать 'ja: loadClass' с экземпляром' fuseki: Server', поскольку в противном случае выражение 'ja: loadClass' может быть проигнорировано. – RobV

Смежные вопросы