JSON形式SPARQL Resultを処理する2010-12-17 21:50:53

あまり使う機会は無いけど。

try {
    FileInputStream fin = new FileInputStream(new File("sparql.json"));
    ResultSet result = JSONInput.fromJSON(fin);
    while(result.hasNext()) {
        QuerySolution qsol = result.next();
        Literal literal = qsol.getLiteral("o");
        String str = (String) literal.getValue();
        System.out.println(str);
    }
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 }


TDBのエラー2010-03-07 22:51:11

サーブレットからTDBの構成ファイルを読み込もうとすると下記エラーが発生した.

com.hp.hpl.jena.assembler.exceptions.AssemblerException: caught: null
  doing:
    root: file:///usr/local/tomcat/webapps/
application/WEB-INF/Store/tdb-assembler.ttl#graph with type: 
http://jena.hpl.hp.com/2008/tdb#GraphTDB assembler class: 
class com.hp.hpl.jena.tdb.assembler.TDBGraphAssembler

どうやらtdb:locationの指定方法が悪いらしい.取りあえずフルパス指定で問題を回避.後で調べよう.

TDBでSPARQL2010-03-05 23:31:08

もちろんSPARQL使うこともできる.

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.tdb.TDBFactory;

public class TDBEx003 {
public static void main(String[] args) {
		String assemblerFile = "Store/tdb-assembler.ttl";
		Model model = TDBFactory.assembleModel(assemblerFile);
		
		String strQuery = "" +
				"PREFIX rdf:  " +
				"PREFIX dc:  " +
				"SELECT ?rc ?title " +
				"WHERE {" +
				"?rc dc:title ?title ." +
				"}";
		Query query = QueryFactory.create(strQuery);
		QueryExecution qexec = QueryExecutionFactory.create(query,model);
		
		ResultSet result = qexec.execSelect();
		
		while(result.hasNext()) {
			QuerySolution qsol = result.next();
			Resource rc = (Resource) qsol.get("rc");
			Literal title = (Literal) qsol.get("title");
			System.out.println(rc);
			System.out.println(title);
		}

		model.close();

	}
}

TDBを使う22010-03-05 23:19:20

URLから直接RDFを読み込む.

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.RDFWriter;
import com.hp.hpl.jena.tdb.TDBFactory;

public class TDBEx002 {
public static void main(String[] args) {
		String assemblerFile = "Store/tdb-assembler.ttl";
		Model model = TDBFactory.assembleModel(assemblerFile);
		// URLから直接RDFを読み込める.
		String strURL = "http://api.flickr.com/services/feeds/geo/?id=7950417@N07&lang=en-us&format=rdf";
		model.read(strURL);

		// リソースを画面に表示する.
		RDFWriter writer = model.getWriter("RDF/XML-ABBREV");
		writer.setProperty("showXMLDeclaration", "true");
		writer.write(model, System.out, "");

		model.close();

	}

}

listStatementsの使い方2009-07-18 21:28:46

指定されたURIをRDF.typeとして持つリソースをリストアップする.

SimpleSelector selector = new SimpleSelector(null,RDF.type,
 ResourceFactory.createResource(typeURI));
for(StmtIterator stmti = model.listStatements(selector);stmti.hasNext();) {
  Statement stmt = stmti.nextStatement();
					
}

SPARQL endpointへの問い合わせ2008-12-25 09:54:02

DBPediaなど公開されているSPARQL endpointが増えている.
これらのendpointに対して問い合わせ処理をJenaで行う場合はQueryExecutionFactoryクラスのsparqlServiceメソッドを利用する
サンプルコードは以下の通り.

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;

public class UsingSparqlEndpointSample {

    public static void main(String[] args) {
        new UsingSparqlEndpointSample ();
    }

    public UsingSparqlEndpointSample () {
        // query
        String sparql = "select * where {?rc  ?x .} limit 10";
        // sparql endpoint's url
        String service = "http://dbpedia.org/sparql";
        
        Query query = QueryFactory.create(sparql, "",
                Syntax.syntaxSPARQL);
        
        QueryExecution queryExe = QueryExecutionFactory
                .sparqlService(service, query);
        
        ResultSet res =   queryExe.execSelect();
        
        while(res.hasNext()) {
            QuerySolution sol = res.nextSolution();
            System.out.println(sol.get("rc"));
            System.out.println(sol.get("x"));
        }
    }
}
ちなみに関係データベースを使った場合は以下のようになる.
import java.sql.SQLException;
import com.hp.hpl.jena.db.DBConnection;
import com.hp.hpl.jena.query.DataSource;
import com.hp.hpl.jena.query.DatasetFactory;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.Syntax;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ModelMaker;

public class UsingRDBSample {

    public static void main(String[] args) {
        new UsingRDBSample();
    }

    public UsingRDBSample() {
        try {
            String sparql = "select * where {?rc  ?x .} limit 10";

            Class.forName("com.mysql.jdbc.Driver");
           
            DBConnection conn = new DBConnection(
"jdbc:mysql://localhost/test?useUnicode=true&
characterEncoding=UTF-8",
 "user", "password", "MySQL");
            ModelMaker maker = ModelFactory.createModelRDBMaker(conn);
            Model model = maker.openModel("modelName");
            
            Query query = QueryFactory.create(sparql, "",
                    Syntax.syntaxSPARQL);
           
            DataSource ds = DatasetFactory.create(model);
            QueryExecution queryExe = QueryExecutionFactory
                    .create(query, ds);
            
            ResultSet res =   queryExe.execSelect();
            
            while(res.hasNext()) {
                QuerySolution sol = res.nextSolution();
                System.out.println(sol.get("rc"));
                System.out.println(sol.get("x"));
            }
            
            conn.close();
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
使う機会はこっちのほうが多いかも.