0

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

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

我在 Java 中使用 Jena。

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

端点 A 中的 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>

端点 B 中的 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 而不同的语句?

4

1 回答 1

2

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

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

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

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

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

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

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

第二种方法更暴力:对于每两个资源resource1并且resource2您想要合并,运行一个循环来复制一个的语句也成为另一个的语句:

for (StmtIterator i = resource1.listStatements(); i.hasNext(); ) {
    Statement s = i.next();
    resource2.addProperty( s.getPredicate(), s.getObject() );
}
于 2012-10-10T10:10:53.413 回答