将模型添加到现有模型RDF中

时间:2012-10-10 07:10:44

标签: merge rdf jena

我尝试合并两个现有的RDF / XML模型。我尝试了不同的解决方案:

  • model1.union(model2)
  • model1.add(model2) //adding a complete model
  • model1.add(model2.listStatements())

我在Java中使用Jena。

我从第二个模型中删除了包络标记(如Equipment),但我总是遇到同样的问题:生成的模型并没有真正合并:它包含每个添加模型的包络。例如,我有2个文件,但有不同的端点。它们应该合并为一个包含所有数据的文档:

endpointA中的bookid123

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:si="http://www.w3schools.com/rdf/">
<rdf:Description rdf:about="http://endpointA/bookid123">
  <si:title>W3Schools.com</si:title>
</rdf:Description>
</rdf:RDF>

endpointB中的bookid123

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:si="http://www.w3schools.com/rdf/">
<rdf:Description rdf:about="http://endpointB/bookid123">
  <si:author>Jan Egil Refsnes</si:author>
</rdf:Description>
</rdf:RDF>

结果,我是这样的:

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:si="http://www.w3schools.com/rdf/">
<rdf:Description rdf:about="http://endpointA/bookid123">
  <si:title>W3Schools.com</si:title>
</rdf:Description>
<rdf:Description rdf:about="http://endpointB/bookid123">
  <si:author>Jan Egil Refsnes</si:author>
</rdf:Description>
</rdf:RDF>

但我需要这样的事情:

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:si="http://www.w3schools.com/rdf/">
<rdf:Description rdf:about="http://couldbeanything/bookid123">
  <si:title>W3Schools.com</si:title>
  <si:author>Jan Egil Refsnes</si:author>
</rdf:Description>
</rdf:RDF>

是否有比获取model1的每个语句更聪明的方法,将它们添加到model2,除了因源-uri而不同的语句?

1 个答案:

答案 0 :(得分:2)

在RDF中,标识符是完整的URI,并且它们不会被视为您碰巧找到它们的任何文档的一部分。所以在您的示例中,

http://endpointA/bookid123
http://endpointB/bookid123

是独特且独立的名称。因此,从RDF的角度来看,合并不会将三元组与这些主题组合在一起是非常正确的。

在您的情况下,您希望通过RDF模型之外的某些方式断言知道 http://endpointA/bookid123http://endpointB/bookid123实际上是相同的资源,因此,关于一个的陈述可以被认为是关于另一个的陈述。

有两种方法可以解决这个问题。首先,您可以使用OWL来表示这两个资源表示同一个人(为了简洁,我将使用Turtle语法,它不会改变含义):

<http://endpointA/bookid123> owl:sameAs <http://endpointB/bookid123> .

为了使其正常工作,您需要使用附加了OWL推理器(例如OWL_MEM_MICRO_RULE_INF)的模型。

第二种方式是更强力:对于要合并的每两个资源resource1resource2,运行一个循环来复制一个语句也是另一个语句:< / p>

for (StmtIterator i = resource1.listStatements(); i.hasNext(); ) {
    Statement s = i.next();
    resource2.addProperty( s.getPredicate(), s.getObject() );
}