2

我正在尝试通过 Fuseki 端点将联合查询与 Jena 一起使用。在我的 SPARQL 查询中使用SERVICE关键字,我连接到一个 Stardog 端点。由于它是一个安全 URL,因此端点指定如下:http://admin:admin@url。由于这不安全,Jena 显示以下消息:

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

根据文档,您可以为凭据指定srv:queryAuthUsersrv:queryAuthPwd。有没有办法直接在 SPARQL 查询中执行此操作?或者,可以在 Fuseki(ttl 文件)中配置吗?

编辑

当我使用@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 = com.hp.hpl.jena.tdb.solver.StageGeneratorDirectTDB@6f2dd58d
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 = com.hp.hpl.jena.sparql.pfunction.PropertyFunctionRegistry@6f05ca41
symbol:http://jena.hpl.hp.com/ARQ/system#opExecutorFactory = com.hp.hpl.jena.tdb.solver.OpExecutorTDB$1@2a1f5501

当我保留 Fuseki 配置并在我的业务层中添加服务上下文时,似乎确实添加了服务上下文:

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}

不管怎样,当我执行联合查询时,我仍然会收到未经授权的消息。

4

1 回答 1

2

不,没有办法直接在 SPARQL 查询中执行此操作

理论上,您可以使用ja:contextFuseki 配置文件中的属性来指定上下文属性。然而在实践中这不起作用,因为服务上下文是嵌套上下文并且汇编器当前不支持嵌套上下文。

但是,您可以做的是使用该ja:loadClass机制加载您添加到执行必要静态初始化的类路径的自定义类,例如

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

请注意,您必须将初始化程序与代表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()才能让 Fuseki 调用它。

通过这个修改后的设置,我能够成功地查询我的本地 Stardog 服务器。

于 2015-03-03T10:51:22.450 回答