2013-03-12 63 views
2

我想直接从Oracle数据库的SPARQL查询中输出一个RDF/XML文件。 查询工作正常,因为我已验证ResultSet对象中的结果。如何在耶拿将SPARQL查询转换为RDF文件?

但是,我不确定如何从那里继续。我想我想为每个QuerySolution创建一个Statement,然后将它添加到Model中。但是我找不到一种方法来实现它,因为我找不到获取谓词值的方法。

任何帮助,将不胜感激,以及暗示我是否走在正确的道路。

QueryExecution qe = QueryExecutionFactory.create(query, oracleSemModel) ;  
ResultSet results = qe.execSelect(); 

Model model = ModelFactory.createDefaultModel(); 

while (results.hasNext()) 
{ 
    QuerySolution result = results.next(); 
    Resource subject = result.getResource("s"); // get the subject 
    Property predicate = result.getProperty("p"); // <-- THIS FUNCTION DOESN'T EXIST 
    RDFNode object = result.get("o");   // get the object 

    Statement stmt = ResourceFactory.createStatement(subject, predicate, object); 

    model.add(stmt); 
} 

model.write(System.out, "RDF/XML-ABBREV"); 
+0

也许我很困惑 - 但结果没有一个主语和谓语...初始查询一样。 – Randy 2013-03-12 20:28:55

回答

6

您还没有显示的查询,但它是可能的形式:

SELECT ?s ?p ?o 
WHERE { 
    ... 
} 

你想实现什么,如果你有CONSTRUCT替换SELECT很简单:

CONSTRUCT { ?s ?p ?o } 
WHERE { 
    ... 
} 

CONSTRUCT通过采用三重模板并将每个解决方案绑定到该模板,然后将结果添加到结果中,从而生成(构建)模型模型。在你的情况下,这个模板只是{ ?s ?p ?o },即使用?s作为主题等。然而,可以使用更复杂的模式,只需在查询结果中的值的位置上写入期望的RDF和变量即可。

最终代码:

QueryExecution qe = QueryExecutionFactory.create(query, oracleSemModel) ; 
Model model = qe.execConstruct(); 
// there is no step 3 
+0

谢谢你的回答,这是一个非常有效的解决方案。 – 2013-03-13 13:08:41