我的问题与此问题中提出的问题类似: Is there a differense between a CONSTRUCT queries sent to a virtuoso endpoint and one sent to a Jena one?
我使用 Virtuoso 开源作为我的图形存储,并使用 jena 提供程序来访问该图形存储中的数据。我正在做几个查询,一切都工作正常(除了惊人的内存量和时间,需要用 virtuoso 进行每次推理,但这应该放在另一个问题中......)。
当我尝试使用构造查询生成模型时出现问题。我尝试使用 VirtuosoQueryExecutionFactory
和查询作为字符串以及默认的 QueryExecutionFactory
与查询工厂:
qexec = VirtuosoQueryExecutionFactory.create(queryString,inputModel);
model = qexec.execConstruct();
还有
Query query = QueryFactory.create(queryString);
qexec = QueryExecutionFactory.create(query,inputModel);
model = qexec.execConstruct();
查询在 sparql 端点中给出了预期结果,但在代码中查询时给出了空模型。
LOGGER.info("The model is: {}", model);
LOGGER.info("The size is: {}", model.size());
给出以下输出:
The model is: <ModelCom {} | >
The size is: 0
我执行查询的模型不为空,并且我从 sparql 端点执行了相同的查询,正如我所说,接收了预期的结果。
有人知道哪里可能出错吗?
谢谢。
丹尼尔。
编辑: 这是我尝试执行的查询。
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl:<http://www.w3.org/2002/07/owl#>
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
PREFIX spatiaCore:<http://www.cedint.upm.es/residentialontology.owl#>
PREFIX test:<http://test.url#>
PREFIX spatiaCore: <http://www.cedint.upm.es/residentialontology.owl#>
CONSTRUCT {
?u ?p ?o1.
?o1 ?p2 ?o2.
?o2 ?p3 ?o3.
?o3 ?p4 ?o4.
?o4 ?p5 ?o5.
?o6 ?p6 ?u.
?o7 ?p7 ?o6
}
WHERE {
?u rdf:type spatiaCore:User.
?u spatiaCore:id "0000000003B3B474"^^<http://www.w3.org/2001/XMLSchema#string>.
?u ?p ?o1.
OPTIONAL {
?o1 ?p2 ?o2.
OPTIONAL {
?o2 ?p3 ?o3.
OPTIONAL {
?o3 ?p4 ?o4.
OPTIONAL {
?o4 ?p5 ?o5.
}
}
}
}
OPTIONAL {
?o6 ?p6 ?u.
OPTIONAL {
?o7 ?p7 ?o6
}
}
}
如您所见,查询尝试构建一个图表,其中包含用户链接到的、深度最多为 5 个关系的所有节点以及链接到用户、深度为最多 2 个关系的节点。
最佳答案
您使用什么方法创建 VirtModel 对象?
注意:
如果您使用过:
public static VirtModel openDefaultModel(DataSource ds);
public static VirtModel openDefaultModel(String url, String user, String password);
因此模型将仅包含来自“virt:DEFAULT”图表的数据。 VirtuosoQueryExecutionFactory 将添加下一个编译指示来查询文本:
define input:default-graph-uri <virt:DEFAULT>
如果你使用了类似的东西:
public static VirtModel openDatabaseModel(String graphName, DataSource ds);
public static VirtModel openDatabaseModel(String graphName, String url, String user, String password)
因此模型将仅包含来自 graphName 图表的数据。 VirtuosoQueryExecutionFactory 将添加下一个编译指示来查询文本:
define input:default-graph-uri <graphName>
如果您想使用所有图表中的数据,则必须调用:
VirtModel vmodel = ....create model method...
vmodel.setReadFromAllGraphs(true);
如果您将上面设置为 TRUE,则不会添加 default-graph-uri 的编译指示。
将 Construct 与 Virtuoso Jena 提供程序一起使用的工作示例:
url = "jdbc:virtuoso://localhost:1111";
VirtGraph set = new VirtGraph ("test1", url, "dba", "dba");
set.clear();
String qry = "INSERT INTO GRAPH <test1> { <aa> <bb> 'cc' . <aa1> <bb> 'zz' }";
VirtuosoUpdateRequest vur = VirtuosoUpdateFactory.create(qry, set);
vur.exec();
Model inputModel = new VirtModel(set);
System.out.println("InputModel :"+inputModel);
System.out.println("InputModel size :"+inputModel.size());
System.out.println();
qry = "CONSTRUCT { ?x <a> ?y } WHERE { ?x <bb> ?y }";
QueryExecution vqe = VirtuosoQueryExecutionFactory.create (qry, inputModel);
Model model = vqe.execConstruct();
System.out.println("Model :"+model);
System.out.println("Model size :"+model.size());
关于java - Virtuoso Jena Provider 构造查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512903/