0

2 つの既存の RDF/XML モデルをマージしようとしました。私はさまざまな解決策を試しました:

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

JavaでJenaを使用しています。

2 番目のモデルからエンベロープ タグ ( などEquipment) を削除しましたが、常に同じ問題があります。結果のモデルは実際にはマージされません。追加された各モデルのエンベロープが含まれています。たとえば、2 つのドキュメントがありますが、エンドポイントが異なります。それらをマージして、すべてのデータを含む 1 つのドキュメントを作成する必要があります。

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>

source-uri のために異なるステートメントを除いて、のすべてのステートメントを取得model1して に追加するよりもスマートな方法はありますか?model2

4

1 に答える 1

2

RDFでは、識別子は完全なURIであり、偶然見つけたドキュメントの一部とは見なされません。したがって、例では、

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

ものに対する一意で独立した名前です。したがって、RDF の観点からは、merge がトリプルとそれらのサブジェクトを一緒に結合しないことはまったく正しいことです。

あなたの場合、RDFモデルの外で何らかの手段によって、 と が実際には同じリソースであり、したがって、一方に関するステートメントは他方に関するステートメントでもあると見なすことができることを主張したいと考えていますhttp://endpointA/bookid123http://endpointB/bookid123

これを処理するには 2 つの方法があります。まず、OWL を使用して、2 つのリソースが同じ個人を表すことを表現できます (簡潔にするために Turtle 構文を使用しますが、意味は変わりません)。

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

これを機能させるには、OWL 推論機能 ( などOWL_MEM_MICRO_RULE_INF) がアタッチされたモデルを使用する必要があります。

2 番目の方法はより強引です: マージする 2 つのリソースごとresource1resource2、ループを実行して一方のステートメントをコピーし、もう一方のステートメントにもします。

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