Virtuoso Jena Provider构造查询错误

时间:2014-03-19 16:56:09

标签: 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 opensource作为我的graphstore并使用jena提供程序来访问该graphstore中的数据。我正在做几个查询,一切都运行正常(除了大量的记忆和时间,每个推断与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
        } 
    }
} 

正如您所看到的,查询尝试构建一个图表,其中包含用户链接到的所有节点,其深度为最多五个关系,以及链接到用户的节点,其深度为最多两个关系。

1 个答案:

答案 0 :(得分:1)

您使用什么样的方法创建VirtModel对象?

注:

如果您使用:

public static VirtModel openDefaultModel(DataSource ds);
public static VirtModel openDefaultModel(String url, String user, String password);

因此模型将仅包含来自“virt:DEFAULT”图的数据。 VirtuosoQueryExecutionFactory将向查询文本添加下一个pragma:

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将向查询文本添加下一个pragma:

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());