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

Merge 将模型添加到现有模型RDF中,merge,rdf,jena,Merge,Rdf,Jena,我尝试合并2个现有的RDF/XML模型。我尝试了不同的解决方案: model1.union(model2) model1.add(model2)//添加完整的模型 model1.add(model2.listStatements()) 我在Java中使用Jena 我从第二个模型中删除了封套标记(如设备),但我始终存在相同的问题:生成的模型没有真正合并:它包含每个添加模型的封套。例如,我有两个文档,但端点不同。它们应合并为一个包含所有数据的文档: endpointA中的bookid123 W

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

  • model1.union(model2)
  • model1.add(model2)//添加完整的模型
  • model1.add(model2.listStatements())
我在Java中使用Jena

我从第二个模型中删除了封套标记(如
设备
),但我始终存在相同的问题:生成的模型没有真正合并:它包含每个添加模型的封套。例如,我有两个文档,但端点不同。它们应合并为一个包含所有数据的文档:

endpointA中的bookid123


W3Schools.com
endpointB中的bookid123


Jan Egil Refsnes
因此,我喜欢这样:


W3Schools.com
Jan Egil Refsnes
但我需要这样的东西:


W3Schools.com
Jan Egil Refsnes

有没有比获取
model1
的每一条语句,将它们添加到
model2
中更聪明的方法,除了由于源uri不同的语句之外?

在RDF中,标识符是完整的uri,它们不被认为是您碰巧在其中找到它们的任何文档的一部分。在你的例子中

http://endpointA/bookid123
http://endpointB/bookid123
是事物的唯一和独立的名称。因此,从RDF的角度来看,merge不会将三元组与这些主题组合在一起,这是非常正确的

在您的例子中,您想要断言,通过RDF模型之外的某种方式,您知道
http://endpointA/bookid123
http://endpointB/bookid123
实际上是同一个资源,因此关于其中一个的声明也可以被视为关于另一个的声明

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


这两个代码段都不是有效的RDF/XML,所以我怀疑第一个代码段是您得到的,而第二个代码段是您想要的!您可能已经知道RDF是根据主谓宾三元组定义的,因此如果您说出每个模型中有哪些三元组,以及最终模型中需要哪些三元组,这会有所帮助。谈论XML标记只会让事情变得混乱。还有,你在用什么图书馆?我猜是ApacheJena,但是有很多RDF库。我编辑了我的示例并添加了更多信息。你说得对,我正在一个java项目中使用jena库。谢谢,我测试了第二个库,它成功了。但这似乎是有限的。我要看看猫头鹰:sameAs。rdfs-->rdfs中的情况似乎相同:另请参见。上面的示例是sparql查询?因为我必须像这样向RDF/XML文档中添加sameAs资源:
owl:sameAs
rdfs:see也
是完全不同的概念
sameAs
在OWL中的解释是,两个资源字面上表示同一个人。意思相当准确
see也
非正式地表示对象URI是一个文档,可以添加有关主题资源的更多信息。正如我在回答中所写的,RDF的片段是用Turtle编码的。如果您想使用RDF,不要考虑语法(RDF/XML、Turtle等等),而是考虑图中的三元组。试图用RDF/XML编写Jena代码只会让您感到困惑。顺便说一句,要了解Turtle,请参阅Jena文档或本页:谢谢,但我仍然不知道如何获取合并内容。endpointA提供的内容具有以下结构:“如果使用启用了OWL推断的Jena
OntModel
,则两个资源在合并模型中具有相同的属性。
<http://endpointA/bookid123> owl:sameAs <http://endpointB/bookid123> .
for (StmtIterator i = resource1.listStatements(); i.hasNext(); ) {
    Statement s = i.next();
    resource2.addProperty( s.getPredicate(), s.getObject() );
}