我尝试合并两个现有的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而不同的语句?
答案 0 :(得分:2)
在RDF中,标识符是完整的URI,并且它们不会被视为您碰巧找到它们的任何文档的一部分。所以在您的示例中,
http://endpointA/bookid123
http://endpointB/bookid123
是独特且独立的名称。因此,从RDF的角度来看,合并不会将三元组与这些主题组合在一起是非常正确的。
在您的情况下,您希望通过RDF模型之外的某些方式断言知道 http://endpointA/bookid123
和http://endpointB/bookid123
实际上是相同的资源,因此,关于一个的陈述可以被认为是关于另一个的陈述。
有两种方法可以解决这个问题。首先,您可以使用OWL来表示这两个资源表示同一个人(为了简洁,我将使用Turtle语法,它不会改变含义):
<http://endpointA/bookid123> owl:sameAs <http://endpointB/bookid123> .
为了使其正常工作,您需要使用附加了OWL推理器(例如OWL_MEM_MICRO_RULE_INF
)的模型。
第二种方式是更强力:对于要合并的每两个资源resource1
和resource2
,运行一个循环来复制一个语句也是另一个语句:< / p>
for (StmtIterator i = resource1.listStatements(); i.hasNext(); ) {
Statement s = i.next();
resource2.addProperty( s.getPredicate(), s.getObject() );
}