通过openRDF Sesame发出访问后端数据库的问题

时间:2014-03-20 21:47:28

标签: mysql sql postgresql sesame openrdf

我在java中有以下代码通过Backend DB(postgreSQL)查询SPARQL查询。

import rdfProcessing.RDFRepository;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;

import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.manager.LocalRepositoryManager;
import org.openrdf.repository.manager.RepositoryManager;
import org.openrdf.sail.config.SailImplConfig;
import org.openrdf.sail.memory.config.MemoryStoreConfig;
import org.openrdf.repository.config.RepositoryImplConfig;
import org.openrdf.repository.sail.config.SailRepositoryConfig;
import org.openrdf.repository.config.RepositoryConfig;

public class Qeryrdf {
    Connection connection;

        private static final String REPO_ID = "C:\\RDF_triples\\univData10m\\repositories\\SYSTEM\\memorystore.data";
        private static final String q1 = ""
                        + "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>" +
                        "PREFIX ub:<http://univ.org#>" + 
                        "PREFIX owl:<http://www.w3.org/2002/07/owl#>" +
                        "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>" +
                        " select distinct  ?o ?p  where"+
                        "{ ?s rdf:type ?o." +
                        "}";

        public static void main(String[] args)
                        throws Exception {
            LocalRepositoryManager manager = new LocalRepositoryManager(new File("C:\\RDF triples\\univData1"));
                manager.initialize();
                try {
                    Qeryrdf queryrdf = new Qeryrdf();
                    queryrdf.executeQueries(manager);
                } finally {
                        manager.shutDown();
                }
        }

        private void executeQueries(RepositoryManager manager)
                        throws Exception {


            SailImplConfig backendConfig = new MemoryStoreConfig();
            RepositoryImplConfig repositoryTypeSpec = new SailRepositoryConfig(backendConfig);

            String repositoryId = REPO_ID;
            RepositoryConfig repConfig = new RepositoryConfig(repositoryId, repositoryTypeSpec);
            manager.addRepositoryConfig(repConfig);

            Repository repo = manager.getRepository(repositoryId);
                repo.initialize();
                RepositoryConnection con = repo.getConnection();

                RDFRepository repository = new RDFRepository();
                String repoDir = "C:\\RDF triples\\univData1" ;
                repository.initializeRepository(repoDir );

                System.out.println("Executing the query");
                executeQuery(q1, con);
                con.close();
                repo.shutDown();
        }

        private void executeQuery(String query, RepositoryConnection con) {
            getConnection();
                try {
                        TupleQueryResult result = con.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate();
                        int resultCount = 0;
                        long time = System.currentTimeMillis();
                        while (result.hasNext()) {
                                result.next();
                                resultCount++;
                        }
                        time = System.currentTimeMillis() - time;
                        System.out.printf("Result count: %d in %fs.\n", resultCount, time / 1000.0);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        public void getConnection() {
            try {
                Class.forName("org.postgresql.Driver");
                connection = DriverManager.getConnection(
                        "jdbc:postgresql://localhost:5432/myDB01", "postgres",
                        "aabbcc");
            } catch (Exception e) {
                e.printStackTrace();
                System.err.println(e.getClass().getName() + ": " + e.getMessage());
                System.exit(0);
            }
            System.out.println("The database opened successfully");
        }
}



我得到了以下结果:

16:46:44.546 [main] DEBUG org.openrdf.sail.memory.MemoryStore - Initializing MemoryStore...
16:46:44.578 [main] DEBUG org.openrdf.sail.memory.MemoryStore - Reading data from C:\RDF triples\univData1\repositories\SYSTEM\memorystore.data...
16:46:44.671 [main] DEBUG org.openrdf.sail.memory.MemoryStore - Data file read successfully
16:46:44.671 [main] DEBUG org.openrdf.sail.memory.MemoryStore - MemoryStore initialized
16:46:44.765 [main] DEBUG org.openrdf.sail.memory.MemoryStore - syncing data to file...
16:46:44.796 [main] DEBUG org.openrdf.sail.memory.MemoryStore - Data synced to file
16:46:44.796 [main] DEBUG o.o.r.manager.LocalRepositoryManager - React to commit on SystemRepository for contexts [_:node18j9mufr0x1]
16:46:44.796 [main] DEBUG o.o.r.manager.LocalRepositoryManager - Processing modified context _:node18j9mufr0x1.
16:46:44.796 [main] DEBUG o.o.r.manager.LocalRepositoryManager - Is _:node18j9mufr0x1 a repository config context?
16:46:44.796 [main] DEBUG o.o.r.manager.LocalRepositoryManager - Reacting to modified repository config for C:\RDF triples\univData1\repositories\SYSTEM\memorystore.data
16:46:44.796 [main] DEBUG o.o.r.manager.LocalRepositoryManager - Modified repository C:\RDF triples\univData1\repositories\SYSTEM\memorystore.data has not been initialized, skipping...
16:46:44.812 [main] DEBUG o.o.r.config.RepositoryRegistry - Registered service class org.openrdf.repository.contextaware.config.ContextAwareFactory
16:46:44.812 [main] DEBUG o.o.r.config.RepositoryRegistry - Registered service class org.openrdf.repository.dataset.config.DatasetRepositoryFactory
16:46:44.843 [main] DEBUG o.o.r.config.RepositoryRegistry - Registered service class org.openrdf.repository.http.config.HTTPRepositoryFactory
16:46:44.843 [main] DEBUG o.o.r.config.RepositoryRegistry - Registered service class org.openrdf.repository.sail.config.SailRepositoryFactory
16:46:44.843 [main] DEBUG o.o.r.config.RepositoryRegistry - Registered service class org.openrdf.repository.sail.config.ProxyRepositoryFactory
16:46:44.843 [main] DEBUG o.o.r.config.RepositoryRegistry - Registered service class org.openrdf.repository.sparql.config.SPARQLRepositoryFactory
16:46:44.859 [main] DEBUG org.openrdf.sail.config.SailRegistry - Registered service class org.openrdf.sail.federation.config.FederationFactory
16:46:44.859 [main] DEBUG org.openrdf.sail.config.SailRegistry - Registered service class org.openrdf.sail.inferencer.fc.config.ForwardChainingRDFSInferencerFactory
16:46:44.859 [main] DEBUG org.openrdf.sail.config.SailRegistry - Registered service class org.openrdf.sail.inferencer.fc.config.DirectTypeHierarchyInferencerFactory
16:46:44.859 [main] DEBUG org.openrdf.sail.config.SailRegistry - Registered service class org.openrdf.sail.inferencer.fc.config.CustomGraphQueryInferencerFactory
16:46:44.859 [main] DEBUG org.openrdf.sail.config.SailRegistry - Registered service class org.openrdf.sail.memory.config.MemoryStoreFactory
16:46:44.859 [main] DEBUG org.openrdf.sail.config.SailRegistry - Registered service class org.openrdf.sail.nativerdf.config.NativeStoreFactory
16:46:44.859 [main] DEBUG org.openrdf.sail.config.SailRegistry - Registered service class org.openrdf.sail.rdbms.config.RdbmsStoreFactory
16:46:44.875 [main] DEBUG org.openrdf.sail.memory.MemoryStore - Initializing MemoryStore...
16:46:44.875 [main] DEBUG org.openrdf.sail.memory.MemoryStore - MemoryStore initialized
16:46:44.876 [main] DEBUG o.openrdf.sail.nativerdf.NativeStore - Initializing NativeStore...
16:46:44.876 [main] DEBUG o.openrdf.sail.nativerdf.NativeStore - Data dir is C:\RDF triples\univData1
16:46:44.970 [main] DEBUG o.openrdf.sail.nativerdf.NativeStore - NativeStore initialized
Executing the query
The database opened successfully
16:46:45.735 [main] DEBUG o.o.query.parser.QueryParserRegistry - Registered service class org.openrdf.query.parser.serql.SeRQLParserFactory
16:46:45.751 [main] DEBUG o.o.query.parser.QueryParserRegistry - Registered service class org.openrdf.query.parser.sparql.SPARQLParserFactory
Result count: 0 in 0.000000s.



我的问题是:
1.我多次更改SPARQL查询但仍检索0行。
那么,OpenRDF Sesame是否连接到PostgreSQL,MySQL等后端数据库?
3.如果是这样,OpenRDF Sesame是否将SPARQL查询转换为SQL然后从后端数据库中获取结果?

提前致谢。

1 个答案:

答案 0 :(得分:3)

首先,按顺序回答您的具体问题:

  1. 如果查询没有给出结果,则表示您执行它的存储库为空,或者您尝试执行的查询与该存储库中的数据不匹配。因为看起来你设置和初始化你的存储库的方式是完全错误的(见下面的评论),它可能是空的。

  2. 一般来说,是的,Sesame 可以连接到PostgreSQL或MySQL数据库进行存储和查询。但是,在您的代码中没有这样做,因为您没有使用Sesame RDBMSStore作为SAIL存储后端,而是使用MemoryStore(顾名思义,它是内存中的)数据库)。

  3. 如果 使用Sesame PostgreSQL / MySQL商店,那么是的,它会将SPARQL查询转换为SQL查询。但是你没有使用它。此外,Sesame PostgreSQL / MySQL支持现已弃用 - 建议不要使用它,而是使用NativeStore或MemoryStore或许多可用的第三方Sesame商店实现中的任何一个。

  4. 更一般地说,查看代码时,不清楚您要完成什么,我无法相信您的代码实际编译,更不用说运行了。

    你在某个地方使用了一个类RDFRepository,它在Sesame 2中不存在,一个方法initializeRepository你给了一个目录,它也不存在。它看起来有点像Sesame 1中的工作方式,但芝麻的那个版本至少已经失效6年了。

    然后你有一个方法getConnection,它建立了一个与PostgreSQL数据库的连接,但是这个方法没有完成任何事情 - 它只是创建一个Connection对象但是什么都没做过那个Connection

    我建议您回到基础并仔细查看Sesame文档,特别是tutorialProgramming with Sesame一章,其中介绍了如何创建和管理存储库以及如何与他们合作。