2011-02-08 11 views
3

すべてのdbpediaページ(例:JenaでDBpediaページのrdf版を処理する方法は?

http://dbpedia.org/page/Ireland

RDFファイルへのリンクがあります。 私のアプリケーションでは、私はrdfコードを分析し、いくつかのロジックを実行する必要があります。 私はdbpedia SPARQLエンドポイントに頼ることができましたが、rdfコードをローカルでダウンロードして解析し、それを完全に制御することを好みます。

私はJENAをインストールしました。コードを解析し、たとえば "geo:geometry"という名前のプロパティを抽出しようとしています。

私がしようとしている:

StringReader sr = new StringReader(node.rdfCode)  
Model model = ModelFactory.createDefaultModel() 
model.read(sr, null) 

は、どのように私は私が必要とする情報を取得するためにモデルを照会することができますか?例えば

、私は声明取得したい場合:

<rdf:Description rdf:about="http://dbpedia.org/resource/Ireland"> 
<geo:geometry xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" rdf:datatype="http://www.openlinksw.com/schemas/virtrdf#Geometry">POINT(-7 53)</geo:geometry> 
</rdf:Description> 

それとも

<rdf:Description rdf:about="http://dbpedia.org/resource/Ireland"> 
<dbpprop:countryLargestCity xmlns:dbpprop="http://dbpedia.org/property/" xml:lang="en">Dublin</dbpprop:countryLargestCity> 
</rdf:Description> 

右フィルタは何を?

多くの感謝! Mulone

+0

が私の答えの最新版を参照してください。 curlで、それは次のようになるだろう。今では、複数の述語をフィルタリングできるより複雑なフィルタが含まれています。 –

答えて

5

あなたが何かを反復処理し、フィルタリングすることもできイエナモデルで解析されたファイルを持っていたら:

//Property to filter the model 
Property geoProperty = 
    model. createProperty("http://www.w3.org/2003/01/geo/wgs84_pos#", 
          "geometry"); 

//Iterator based on a Simple selector 
StmtIterator iter = 
    model.listStatements(new SimpleSelector(null, geoProperty, (RDFNode)null)); 

//Loop to traverse the statements that match the SimpleSelector 
while (iter.hasNext()) { 
    Statement stmt = iter.nextStatement(); 
    System.out.print(stmt.getSubject().toString()); 
    System.out.print(stmt.getPredicate().toString()); 
    System.out.println(stmt.getObject().toString()); 

} 

SimpleSelectorはあなたが文に一致するように任意の(主語、述語、オブジェクト)のパターンを渡すことができますモデルではあなたのケースでは、特定の述語だけを気にしていれば、コンストラクタの1番目と3番目のパラメータはnullです。

Property geoProperty = /* like before */; 
Property countryLargestCityProperty = 
    model. createProperty("http://dbpedia.org/property/", 
          "countryLargestCity"); 

SimpleSelector selector = new SimpleSelector(null, null, (RDFNode)null) { 
    public boolean selects(Statement s) 
     { return s.getPredicate().equals(geoProperty) || 
       s.getPredicate().equals(countryLargestCityProperty) ;} 
} 
StmtIterator iter = model.listStatements(selector); 
while(it.hasNext()) { 
    /* same as in the previous example */ 
} 

編集:完全な例

含むあなたがここのような SimpleSelectorインタフェースで selectsメソッドを実装することができ、より複雑なフィルタリングを可能にするには二つの異なる性質

をフィルタリング許可

このコードには、私のために。

import com.hp.hpl.jena.util.FileManager; 
import com.hp.hpl.jena.rdf.model.Model; 
import com.hp.hpl.jena.rdf.model.SimpleSelector; 
import com.hp.hpl.jena.rdf.model.Property; 
import com.hp.hpl.jena.rdf.model.RDFNode; 
import com.hp.hpl.jena.rdf.model.Literal; 
import com.hp.hpl.jena.rdf.model.StmtIterator; 
import com.hp.hpl.jena.rdf.model.Statement; 

public class TestJena { 

    public static void main(String[] args) { 
     FileManager fManager = FileManager.get(); 
     fManager.addLocatorURL(); 
     Model model = fManager.loadModel("http://dbpedia.org/data/Ireland.rdf"); 

     Property geoProperty = 
     model. createProperty("http://www.w3.org/2003/01/geo/wgs84_pos#", 
            "geometry"); 

     StmtIterator iter = 
      model.listStatements(new SimpleSelector(null, geoProperty,(RDFNode) null)); 

     //Loop to traverse the statements that match the SimpleSelector 
     while (iter.hasNext()) { 
      Statement stmt = iter.nextStatement(); 
      if (stmt.getObject().isLiteral()) { 
       Literal obj = (Literal) stmt.getObject(); 
       System.out.println("The geometry predicate value is " + 
                  obj.getString()); 
      } 
     } 
    } 

} 

この完全な例では、出力します:リンクされたデータ

http://dbpedia.org/page/Ireland

The geometry predicate value is POINT(-7 53) 

注意をされているリソースhttp://dbpedia.org/resource/Ireland

のHTMLドキュメントのバージョンをRDFを得るために解決する必要があります:

HTTPヘッダーの0

http://dbpedia.org/data/Ireland.rdf

又は

http://dbpedia.org/resource/Ireland + Accept: application/rdfxml

curl -L -H 'Accept: application/rdf+xml' http://dbpedia.org/resource/Ireland

+0

ありがとう!実際には、たとえ文がモデルにはっきりとはっきりしていても、「ジオメトリ」のフィルタは何も選択しないという問題があります。それについてのアイデア?再度、感謝します! – Mulone

+0

@Mulone完全版の例で新版を参照してください。うまくいけば、エラーを発見するのに役立ちます。それがあなたのために働くかどうか私に教えてください。 –

+0

それは動作します!どうもありがとうございました! – Mulone

関連する問題