2014-10-31 145 views
0

我已经写了一个java程序,它从.csv获取数据,并将这些数据转换为RDFXML。在编写这个程序时,我使用了sesame's框架,程序成功地完成了它写的任务。将rdfxml转换成龟三元组

但是,我想单元测试这个程序使用jUnit,我需要测试一个方法,将RDF三元组(turtle格式)转换为RDFXML。为了表明该方法正常工作,我想通过将RDFXML转换回三元组并将其与我传入该方法的原始三元组进行比较来完成此操作。到目前为止,我还没有在sesame's文档中发现任何内容。有什么建议么?

+0

你只是想用TTL写数据而不是RDF/XML?你如何用RDF/XML编写数据(代码请:))? – 2014-10-31 17:53:28

+0

我其实只是想通了。事实证明,我根本不需要在TTL中重写它。我只需要用一个RDFXMLParser解析RDFXML文件,并且没有问题地获取这些语句。我会在下面发布我的解决方案。 – DivDiff 2014-10-31 18:24:54

+0

为了将来的参考,Sesame的Rio解析器/编写器工具包记录在[这里](http://rdf4j.org/sesame/2.7/docs/users.docbook?view#Parsing_and_Writing_RDF_with_Rio)。它实际上包含一个代码示例,显示如何从一种格式转换为另一种格式。 – 2014-11-01 00:54:14

回答

1

我刚刚在几分钟前解决了这个问题。这里是我的解决方案:

@Test 
public void testWriteStmtToRDFPos(){ 
    RDFParser parser = new RDFXMLParser(); 
    String baseURI = ""; 
    Model origStmts = new LinkedHashModel(); 
    Model processedStmts = new LinkedHashModel(); 
    StatementCollector collector = new StatementCollector(processedStmts); 
    parser.setRDFHandler(collector); 
    origStmts.add(sexOffend,predicate,object); 

    try{ 

     converter.writeStmtToRDF(origStmts, rdfFile); 

     FileReader reader = new FileReader(rdfFile); 
     parser.parse(reader, baseURI); 
     if(origStmts.equals(processedStmts)){ 
      assert(true); 
     } 

    }catch(FileNotFoundException e){ 
     e.printStackTrace(); 
     fail(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
     fail(); 
    } 
} 

当您设置集热器的解析器之上,它只是收集解析器摄取任何声明。完成此操作后,您可以将收集器与origStmts进行比较。这并不是显而易见的,但找到它之后非常有用!

+0

这将工作得很好,但作为一个提示:它可以做到更短,更方便,通过使用这个:'models processedStmts = Rio.parse(reader,baseURI,RDFFormat.RDFXML);' – 2014-11-01 01:07:13

+0

我也应该指出,使用用于比较两个RDF模型的'Model.equals'并不总是给出预期的结果:如果您的RDF模型包含空白节点,则尽管模型基本相同,但它将失败。您应该使用[ModelUtil.equals](http://rdf4j.org/sesame/2.7/apidocs/index.html?org/openrdf/model/util/ModelUtil.html)。 – 2014-11-01 01:17:53