java - Virtuoso Jena Provider 构造查询错误

标签 java sparql jena virtuoso

我的问题与此问题中提出的问题类似: 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/

相关文章:

java - 如何将 RDF 转换为字符串

java - 如何追加多个 SPARQL 查询的结果并将其写入 RDF

java - 比较 2 个 Java 哈希集中的键值

java - 屏幕关闭时的 Android 音量按钮监听器

rdf - 无法通过本地定义的谓词提取 RDF 三元组

sparql - 我可以使用什么 SPARQL 术语来引用 Wikipedia 类别

sparql - DELETE WHERE 查询中的可选三元组

java - 滚动日历未按预期持续

java - java中找到两个节点的最小公共(public)祖先

rdf - 在加载到 apache-jena TDB Triplestore 之前清理 YAGO 文件