Jena API使用紹介

21500 ワード

ここではjenaの使用について簡単に紹介します.一部の内容はこちらを参考にしておりますhttp://jena.apache.org/tutorials/rdf_api.html .
 
1.jenaパッケージのダウンロードと開発環境の構成

  • まず、ここからjenaパッケージapache-jana-2.7.*をダウンロードします.tar.gz.解凍する.

  • Eclipseを開き、Javaプロジェクトを新規作成します.

  • プロジェクト->properties->Java Build Path->librariesを右クリックします.解凍後のlibディレクトリのjarファイルをbuild pathに追加します.

  • OK.今はプロジェクトでjenaを使うことができます.

  • 2.jena簡単に使う
    まず次の例を見てみましょう.これはpeopleリソースです.RDFにおける人間に関する情報はvcardで表すのが適切である.RDFのvCardの詳細についてはhttp://www.w3.org/TR/vcard-rdf/.
    Jena API 使用介绍_第1张图片
    この例では、リソースhttp://.../JohnSmith人を表す.この人のフルネームはJohn Smith,すなわちvcard:FN属性の値はJohn Smithである.Jenaでは,リソースはResourceクラスで表され,その属性はPropertyクラスで表される.全体モデルはModelクラスで表されます.すなわち、上図はModelです.1つのModelオブジェクトに複数のリソースを含めることができます.
    上述したリソースはjenaプログラミングを用いて以下のように表される.
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.vocabulary.VCARD;
    
    public class Introduction {
    	static String personURI    = "http://somewhere/JohnSmith";
    	static String fullName     = "John Smith";
    
    	public static void main(String[] args){
    		// create an empty Model
    		Model model = ModelFactory.createDefaultModel();
    
    		// create the resource
    		Resource johnSmith = model.createResource(personURI);
    
    		// add the property
    		johnSmith.addProperty(VCARD.FN, fullName);
    	}
    }
    

    ここで、ModelFactoryクラスはModelオブジェクトを作成するModelファクトリです.ModelのcreateResourceメソッドを使用してmodelにリソースを作成し、リソースのaddPropertyメソッドを使用してプロパティを追加できます.
     
    3.jenaのStatement
    Modelの各矢印は記述(Statement)です.Statementは主語、述語、客体の3つの部分から構成されています.
  • 主語:図示中の矢印の出発位置.リソースを表します.
  • 述語:図示の矢印.リソースのプロパティを表します.
  • ゲスト:図示の矢印が指す位置.属性を表す値.テキストでもリソースでも構いません.

  • 次の図はModelを示しています.
    Jena API 使用介绍_第2张图片
    各矢印はStatementを表します.リソースなどhttp://.../JohnSmithテキスト「John Smith」という値を持つvCard:FN属性があります.このリソースにはもう1つのvCard:N属性があります.この属性の値は別の無名リソースです.この無名リソースにはvCard:GivenとvCard:Familyの2つの属性があります.その値はそれぞれテキストの「John」と「Smith」です.
    Jena APIを用いてこのRDFのStatementを解析することができる.
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Property;
    import com.hp.hpl.jena.rdf.model.RDFNode;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.rdf.model.Statement;
    import com.hp.hpl.jena.rdf.model.StmtIterator;
    import com.hp.hpl.jena.vocabulary.VCARD;
    
    public class StatementDemo {
    	public static void main(String[] args){
    		
    		//Introduction
    		String personURI = "http://somewhere/JohnSmith";
    		String givenName = "John";
    		String familyName = "Smith";
    		String fullName = givenName + " " + familyName;
    		Model model = ModelFactory.createDefaultModel();
    		
    		Resource johnSmith = model.createResource(personURI);
    		johnSmith.addProperty(VCARD.FN, fullName);
    		johnSmith.addProperty(VCARD.N, 
    					model.createResource()
    						.addProperty(VCARD.Given, givenName)
    						.addProperty(VCARD.Family, familyName));
    		
    		//Statement
    		StmtIterator iter = model.listStatements();
    		
    		while(iter.hasNext()){
    			Statement stmt = iter.nextStatement();
    			Resource subject = stmt.getSubject();
    			Property predicate = stmt.getPredicate();
    			RDFNode object = stmt.getObject();
    			
    			System.out.print(subject.toString());
    			System.out.print(" "+predicate.toString());
    			if(object instanceof Resource){
    				System.out.print(object.toString());
    			}else{
    				System.out.print("\"" + object.toString() + "\"");
    			}
    			
    			System.out.println(" .");
    		}
    	}
    }
    

    ModelクラスのlistStatementsは、StatementのIteratorを返します.Statementには、getSubject、getPredicate、getObjectの主語、述語、ゲストがあります.そのタイプはResource、Property、RDFNodeです.ゲストobjectタイプはResourceまたはユーザテキストです.
    プログラムの出力は次のとおりです.
    http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#N-1e19b4fe:13bd0803952:-7fff .
    http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#FN"John Smith" .
    -1e19b4fe:13bd0803952:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Family"Smith" .
    -1e19b4fe:13bd0803952:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Given"John" .

    この4つは、上の図の4つの矢印である4つのStatementを表しています.ここにはリソース名が指定されていないリソースがあります.
    4.出力RDF
    次の例を見てみましょう.
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.vocabulary.VCARD;
    
    
    public class RDFWriting {
    	public static void main(String[] args){
    		
    		//Introduction
    		String personURI = "http://somewhere/JohnSmith";
    		String givenName = "John";
    		String familyName = "Smith";
    		String fullName = givenName + " " + familyName;
    		Model model = ModelFactory.createDefaultModel();
    		
    		Resource johnSmith = model.createResource(personURI);
    		johnSmith.addProperty(VCARD.FN, fullName);
    		johnSmith.addProperty(VCARD.N, 
    					model.createResource()
    						.addProperty(VCARD.Given, givenName)
    						.addProperty(VCARD.Family, familyName));
    		
    		//Model write
    		model.write(System.out);
    		System.out.println();
    		model.write(System.out, "RDF/XML-ABBREV");
    		System.out.println();
    		model.write(System.out, "N-TRIPLE");
    	}
    }
    

    Modelは、第3部の図示と同様です.Modelのwriteメソッドで、そのModelのコンテンツを出力ストリームに書き込むことができます.この例の出力は、次のとおりです.
     
      
        
        John Smith
      
      
        Smith
        John
      
    
    
    
      
        
          Smith
          John
        
        John Smith
      
    
    
      _:AX2dX498ae941X3aX13bd08e9fe5X3aXX2dX7fff .
      "John Smith" .
    _:AX2dX498ae941X3aX13bd08e9fe5X3aXX2dX7fff  "Smith" .
    _:AX2dX498ae941X3aX13bd08e9fe5X3aXX2dX7fff  "John" .

    model.write(OutputStream)、model.write(OutputStream、「RDF/XML-ABBREV」)、model.write(OutputStream,"N-TRIPLE")はそれぞれ異なるフォーマットの内容を出力する.
  • model.write(OutputStream):modelも使用できます.代わりにwrite(OutputStream,null)を使用します.デフォルトの出力フォーマット.
  • model.write(OutputStream、「RDF/XML-ABBREV」):XMLサムネイル構文を使用してRDFを出力します.
  • model.write(OutputStream,"N-TRIPLE"):nタプルのフォーマットを出力します.

  • 5.RDF入力
    次のrdfファイルがあります
    resources.rdf:
    
      
        Smith
        John
      
      
        John Smith
        
      
      
        Sarah Jones
        
      
      
        Matt Jones
        
      
      
        Smith
        Rebecca
      
      
        Jones
        Sarah
      
      
        Jones
        Matthew
      
      
        Becky Smith
        
      
    

    4つのPeopleリソースが含まれています.次のプログラムはrdfファイルを読み取り、コンテンツを出力します.
    import java.io.InputStream;
    
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.util.FileManager;
    
    public class RDFReading {
    	public static String inputFileName = "resources.rdf";
    	
    	public static void main(String[] args){
    		Model model = ModelFactory.createDefaultModel();
    
    		//    FileManager     
    		InputStream in = FileManager.get().open( inputFileName );
    		if (in == null) {
    			throw new IllegalArgumentException(
    	                                 "File: " + inputFileName + " not found");
    		}
    
    		//   RDF/XML   
    		model.read(in, null);
    
    		model.write(System.out);
    	}
    }
    

    Modelのreadメソッドは、RDFをmodelに入力することを読み取ることができる.2番目のパラメータはフォーマットを指定できます.
    6.Namespace接頭辞の設定
    次の例を見てみましょう.
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Property;
    import com.hp.hpl.jena.rdf.model.Resource;
    
    
    public class NSPrefix {
    	public static void main(String[] args){
    		Model m = ModelFactory.createDefaultModel();
    		String nsA = "http://somewhere/else#";
    		String nsB = "http://nowhere/else#";
    		
    		//  Resource   Property
    		Resource root = m.createResource( nsA + "root" );
    		Property P = m.createProperty( nsA + "P" );
    		Property Q = m.createProperty( nsB + "Q" );
    		Resource x = m.createResource( nsA + "x" );
    		Resource y = m.createResource( nsA + "y" );
    		Resource z = m.createResource( nsA + "z" );
    		
    		//      Statement
    		m.add( root, P, x ).add( root, P, y ).add( y, Q, z );
    		System.out.println( "# -- no special prefixes defined" );
    		m.write( System.out );
    		System.out.println( "# -- nsA defined" );
    		
    		//  Namespace nsA     “nsA”
    		m.setNsPrefix( "nsA", nsA );
    		m.write( System.out );
    		System.out.println( "# -- nsA and cat defined" );
    		
    		//  Namespace nsB     “cat”
    		m.setNsPrefix( "cat", nsB );
    		m.write( System.out );
    	}
    }
    

    このプログラムはまずModelのcreatePropertyとcreateResource生成属性とリソースを呼び出します.Modelを呼び出します.addはモデルに3つのStatementを追加したいと思っています.addの3つのパラメータはそれぞれ3元グループの主語、述語、客体である.モデルにコンテンツを追加したいのは、実際には三元グループを追加することです.
    ModelのsetNsPrefix関数は、名前空間接頭辞を設定するために使用されます.プログラムの出力は次のとおりです.
    # -- no special prefixes defined
     
      
        
      
      
        

    # -- nsA defined

    # -- nsA and cat defined

    如果我们没有为RDF 指定namespace 前缀,则jena 会自动为其生成名为 j.0, j.1 的名字空间。

    7. jena 的 Model 访问

    上面介绍了jena 用来创建、读、写 RDF Model,本部分将主要用来访问RDF Model 的信息,对Model 的内容进行操作。

    看下面一个例子:

    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.rdf.model.StmtIterator;
    import com.hp.hpl.jena.vocabulary.VCARD;
    
    public class ModelAccess {
    	public static void main(String[] args){
    		String personURI = "http://somewhere/JohnSmith";
    		String givenName = "John";
    		String familyName = "Smith";
    		String fullName = givenName + " " + familyName;
    		Model model = ModelFactory.createDefaultModel();
    		
    		Resource johnSmith = model.createResource(personURI);
    		johnSmith.addProperty(VCARD.FN, fullName);
    		johnSmith.addProperty(VCARD.N, 
    					model.createResource()
    						.addProperty(VCARD.Given, givenName)
    						.addProperty(VCARD.Family, familyName));
    		
    		//   Model     
    		Resource vcard = model.getResource(personURI);
    		
    		/*
    		//   N     (     getObject()  )
    		Resource name = (Resource) vcard.getProperty(VCARD.N)
    		                                .getObject();
    		*/
    		
    		//            ,       getResource   
    		Resource name = vcard.getProperty(VCARD.N)
    		                     .getResource();
    		
    		//        literal,    getString   
    		fullName = vcard.getProperty(VCARD.FN)
    		                        .getString();
    		
    		//      NICKNAME   
    		vcard.addProperty(VCARD.NICKNAME, "Smithy")
    		     .addProperty(VCARD.NICKNAME, "Adman");
    		
    		System.out.println("The nicknames of \""
    		                      + fullName + "\" are:");
    		
    		//     NICKNAME   ,      listProperties   
    		StmtIterator iter = vcard.listProperties(VCARD.NICKNAME);
    		while (iter.hasNext()) {
    		    System.out.println("    " + iter.nextStatement()
    		                                    .getObject()
    		                                    .toString());
    		}
    	}
    }
    

    本例では主に以下の内容を用いた.
  • ModelのgetResourceメソッド:このメソッドは、パラメータに基づいてリソースオブジェクトを返します.
  • ResourceのgetPropertyメソッド:パラメータに基づいて属性オブジェクトを返します.
  • PropertyのgetObjectメソッド:属性値を返します.実際のタイプがResourceかliteralかによって強制的に変換されます.
  • PropertyのgetResourceメソッド:属性値のリソースを返します.プロパティ値がResourceでない場合は、エラーが表示されます.
  • PropertyのgetStringメソッド:属性値のテキスト内容を返します.属性値がテキストでない場合は、エラーが表示されます.
  • ResourceのlistPropertiesメソッド:条件に一致する属性が見つかりました.

  • 8.Modelへのクエリー
    JenaとコアAPIは、限られたクエリー操作のみをサポートします.ここで簡単に紹介します.
  • Model.ListStatements():ModelのすべてのStatementsがリストされます.
  • Model.ListSubjects():属性を持つすべてのリソースをリストします.
  • Model.ListSubjectsWithProperty(Property p,RDFNode o):属性pがあり、その値がoのすべてのリソースがリストされます.

  • 上記のいくつかのクエリはModelに対するものである.ListStatements(Selector s)はいくつかの包装を行って得た.のように
  • Selector selector = new SimpleSelector(subject, predicate, object). このセレクタは、すべての主語がsubjectに合致し、述語がpredicateに合致し、ゲストがobjectに合致するStatementを選択します.

  • 以下では、fullNameを持つリソースをそれぞれ2つの方法でクエリーします.
    1.Modelを使用する.ListSubjectsWithPropertyクエリー:
    import java.io.InputStream;
    
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.ResIterator;
    import com.hp.hpl.jena.util.FileManager;
    import com.hp.hpl.jena.vocabulary.VCARD;
    
    public class RDFQuery {
    	public static String inputFileName = "resources.rdf";
    	
    	public static void main(String[] args){
    		Model model = ModelFactory.createDefaultModel();
    
    		InputStream in = FileManager.get().open( inputFileName );
    		if (in == null) {
    			throw new IllegalArgumentException(
    	                                 "File: " + inputFileName + " not found");
    		}
    
    		model.read(in, null);
    
    		//   listResourcesWithProperty
    		ResIterator iter = model.listResourcesWithProperty(VCARD.FN);
    		if(iter.hasNext()){
    			System.out.println("The database contains vcard for:");
    			while(iter.hasNext()){
    				System.out.println(" "+iter.nextResource().getProperty(VCARD.FN).getString());
    			}
    		}else{
    			System.out.println("No vcards were found in the database");
    		}
    	}
    }

     
    2.Selectorクエリーを使用するには:
    import java.io.InputStream;
    
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.RDFNode;
    import com.hp.hpl.jena.rdf.model.SimpleSelector;
    import com.hp.hpl.jena.rdf.model.StmtIterator;
    import com.hp.hpl.jena.util.FileManager;
    import com.hp.hpl.jena.vocabulary.VCARD;
    
    public class RDFQuery1 {
    	public static String inputFileName = "resources.rdf";
    	
    	public static void main(String[] args){
    		Model model = ModelFactory.createDefaultModel();
    
    		InputStream in = FileManager.get().open( inputFileName );
    		if (in == null) {
    			throw new IllegalArgumentException(
    	                                 "File: " + inputFileName + " not found");
    		}
    
    		model.read(in, null);
    
    		//   Selector
    		StmtIterator iter = model.listStatements(new SimpleSelector(null, VCARD.FN, (RDFNode)null));
    		if(iter.hasNext()){
    			System.out.println("The database contains vcard for:");
    			while(iter.hasNext()){
    				System.out.println(" "+iter.nextStatement().getString());
    			}
    		}else{
    			System.out.println("No vcards were found in the database");
    		}
    	}
    }

    この例ではresourcesを用いる.rdfリソース.上記の2つの例の出力は、次のとおりです.
    The database contains vcard for:
     Becky Smith
     Matt Jones
     Sarah Jones
     John Smith

    9.Modelの削除操作
    データベースの操作には、主に増加、削除、変更、検索などが含まれていることがわかります.RDFに対してもこのいくつかの操作を実現することができます.クエリー操作について説明しましたが、このセクションではRDF Modelの削除操作について説明します.1つのRDFに対してStatementを追加または削除することができます.RDF Modelは完全にStatementsで構成されているため,これに基づいてリソースや属性などの削除を実現できる.変更操作は削除後に追加することで実現できます.
    次の例を見てください.
    import com.hp.hpl.jena.rdf.model.Model;
    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.RDFNode;
    import com.hp.hpl.jena.rdf.model.Resource;
    import com.hp.hpl.jena.vocabulary.VCARD;
    
    
    public class AddDelete {
    	public static void main(String[] args){
    		String personURI = "http://somewhere/JohnSmith";
    		String givenName = "John";
    		String familyName = "Smith";
    		String fullName = givenName + " " + familyName;
    		Model model = ModelFactory.createDefaultModel();
    		
    		Resource johnSmith = model.createResource(personURI);
    		johnSmith.addProperty(VCARD.FN, fullName);
    		johnSmith.addProperty(VCARD.N, 
    					model.createResource()
    						.addProperty(VCARD.Given, givenName)
    						.addProperty(VCARD.Family, familyName));
    
    		System.out.println("    :");
    		model.write(System.out);
    		//    Statement 		
    		model.remove(model.listStatements(null, VCARD.N, (RDFNode)null));
    		model.removeAll(null, VCARD.Given, (RDFNode)null);
    		model.removeAll(null, VCARD.Family, (RDFNode)null);
    		
    		System.out.println("
    :"); model.write(System.out); // Statement model.add(johnSmith, VCARD.N, model.createResource() .addProperty(VCARD.Given, givenName) .addProperty(VCARD.Family, familyName)); System.out.println("
    :"); model.write(System.out); } }

    この例では、まずModelを生成し、Modelを使用します.removeメソッドは、いくつかのstatementエントリを削除し、Modelを使用します.addはまた増えて帰ってきた.
    Model.removeメソッドはstatementの削除操作を実現できる、Model.addはstatementの増加を実現することができる.
    Modelを直接使用する方法に加えて、ModelのResource(リソース)またはProperty(プロパティ、実際にはResourceから継承)を削除することで、Modelを変更することもできます.
    10 .Modelのマージ操作
    Modelのマージは、主に交差、並列、補完の3つの操作に分けられます.
    次の図に示します.
    Jena API 使用介绍_第3张图片            Jena API 使用介绍_第4张图片
    この2つの図はそれぞれ1つのModelを表している.名前は同じで、同じ属性vcard:FNを持ち、値はJohn Smithです.そこで,この2つのModelに対して「並列」(union)操作を行った.得られたModelの図形は以下のように表される.
    Jena API 使用介绍_第5张图片
    重複するvcard:FN値は1つしか表示されません.
    この3つの操作方法は、次のとおりです.
  • Model.intersection(Model model):交差操作.以前の2つのモデルにある部分を含む新しいモデルを作成します.
  • Model.Union(Model model):を実行します.前の2つのModelのいずれかが持つ部分を含む新しいModelを作成します.
  • Model.difference(Model model):補足操作.新しいModelを作成します.新しいModelには、このModelのパラメータに示されているModelにはない部分が含まれています.

  • 11.まとめ
    本稿では,コアJena APIについて比較的包括的に紹介した.Jena APIはRDFを処理するJavaフレームワークである.RDFは、リソース記述のために使用される.
    本明細書のすべての例は、本人のデバッグによって正常に動作しています.
    Jenaの詳細については、「http://jena.apache.org/index.html .
    RDFの詳細については、「http://www.w3.org/RDF/ .さらにhttp://www.w3school.com.cn/rdf/index.asp簡単な紹介です.