Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有安全SPARQL端点的联合查询_Sparql_Jena_Triplestore_Stardog_Federated Queries - Fatal编程技术网

具有安全SPARQL端点的联合查询

具有安全SPARQL端点的联合查询,sparql,jena,triplestore,stardog,federated-queries,Sparql,Jena,Triplestore,Stardog,Federated Queries,我试图通过Fuseki端点对Jena使用联邦查询。使用SPARQL查询中的SERVICE关键字,我正在连接到Stardog端点。由于它是一个受保护的URL,端点指定如下:。由于这不安全,Jena显示以下消息: Code: 36/HAS_PASSWORD in USER: Including passwords in URIs is deprecated. 根据,可以为凭据指定srv:queryAuthUser和srv:queryAuthPwd。有没有办法直接在SPARQL查询中执行此操作?或者

我试图通过Fuseki端点对Jena使用联邦查询。使用SPARQL查询中的SERVICE关键字,我正在连接到Stardog端点。由于它是一个受保护的URL,端点指定如下:。由于这不安全,Jena显示以下消息:

Code: 36/HAS_PASSWORD in USER: Including passwords in URIs is deprecated.
根据,可以为凭据指定srv:queryAuthUser和srv: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}

但是,当我执行联邦查询时,仍然会收到未经授权的消息。

不,在SPARQL查询中无法直接执行此操作

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

但是,您可以改为使用
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);
    }
}
package org.apache.jena.playder;
导入java.util.HashMap;
导入java.util.Map;
导入com.hp.hpl.jena.query.ARQ;
导入com.hp.hpl.jena.sparql.engine.http.Service;
导入com.hp.hpl.jena.sparql.util.Context;
公共类起始值设定项{
公共静态void init(){
//准备Stardog特定的上下文
Context stardogContext=新上下文();
set(Service.queryAuthUser,“admin”);
set(Service.queryAuthPwd,“admin”);
//将上下文与端点URL关联
Map serviceContexts=新建HashMap();
//这里是要查询的Stardog数据库的名称
serviceContexts.put(“http://localhost:5820/temp/query“,stardogContext);
//将服务上下文与全局ARQ上下文关联
ARQ.getContext().set(Service.serviceContext,serviceContexts);
}
}
请注意,该方法需要是静态的,并且需要调用
init()
,以便Fuseki调用它


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

另外,Stardog 3将支持SERVICE关键字,这可能会使您的工作更轻松。是的,那将很好。再过两周,Stardog3就应该出局了。我仍然收到访问/ds/query时出现问题的消息。原因:未经授权。也许我的计划有错误。我已验证是否加载了自定义初始值设定项。请记住,我希望在使用服务的同时查询TDB和Stardog。您是否可以尝试将
ja:loadClass
fuseki:Server
实例显式关联,否则它看起来像是
ja:loadClass
语句ignored@tstorms做了更多的挖掘,弄清楚了到底是什么您需要这样做才能使其成功运行。查看我的更新答案,该答案适用于我的本地Stardog和Fuseki设置我感谢您的挖掘,但遗憾的是,我仍然收到未经授权的异常。所有内容都经过三次检查,URL正确,stardog端点可以使用相同的凭据单独查询。也许有一个星狗的设置需要改变?任何指针仍然非常受欢迎。我已经在类路径上与jena和fuseki创建了一个最小的项目。现在,当我使用最新的库版本(分别为2.12.1和1.1.1)时,它就可以工作了!我将很难升级实际的项目,但我会给它一个机会。谢谢你的帮助!