2012-10-10 56 views
0

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

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

我在Java中使用耶拿。

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

bookid123在endpointA

<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> 

bookid123在endpointB

<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> 

但我需要像th是:

<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

两者都不这些片段是有效的RDF/XML,所以我怀疑第一个是你得到的,我怀疑第二个是你想要的!您可能已经知道RDF是用主谓谓词对象三元组来定义的,所以如果您说出每个模型中的三倍,以及最终模型中您想要的三倍,这将有所帮助。谈论XML标签只是混淆了事情。另外,你在使用什么库?我猜这是Apache Jena,但是那里有很多RDF库。 – cygri

+0

我编辑了我的示例并添加了更多信息。你说得对,我正在Java项目中使用jena库。 – wassermine

回答

2

在RDF中,标识齐全的URI,他们不认为你碰巧发现他们在任何文档的一部分。因此,在你的榜样,

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

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

在你的情况,你是想断言,由RDF模型之外的一些手段,你知道http://endpointA/bookid123http://endpointB/bookid123实际上是相同的资源,并且因此,发言大约一个可以被认为是还语句关于其他。

有两种处理方法。首先,你可以用OWL来表达,这两个资源表示同一个人(我会用龟语法简洁,它不会改变的意思):

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

为了这个工作,你需要使用附带OWL推理器的模型(例如OWL_MEM_MICRO_RULE_INF)。

第二种方式是更强力:每对资源resource1resource2要合并,运行一个循环来复制一个的声明,也成为其他的语句:

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

谢谢,我测试了第二个,它工作。但是这似乎是有限的。我会看看owl:sameAs。它在rdfs - > rdfs:seeAlso中似乎是一样的。你上面的例子是一个sparql查询?因为我必须像这样为我的RDF/XML文档添加sameAs-Resource:? – wassermine

+0

不,'owl:sameAs'和'rdfs:seeAlso'根本不是同一个概念。 'sameAs'在OWL中解释了两个资源*字面上*表示同一个人。意思很精确。 'seeAlso' *非正式*表示对象URI是一个文档,它可能*添加更多关于主题资源的信息。正如我在答案中所写的那样,RDF的片段在Turtle中编码。如果你想使用RDF,不要考虑语法(RDF/XML,Turtle,不管),而是考虑图中的三元组。试图用RDF/XML来编写Jena代码只会让你感到困惑。 –

+0

顺便提一下,要了解Turtle,请参阅Jena文档或此页:https://en.wikipedia.org/wiki/Turtle_%28syntax%29 –

相关问题