首页 文章

使用RDF4J在远程服务器上创建存储库

提问于
浏览
1

我一直在尝试使用RDF4J在远程GraphDB服务器上创建一个新的存储库,但我遇到了问题 .

This runs, but is seemingly not correct

HTTPRepositoryConfig implConfig = new HTTPRepositoryConfig(address);
RepositoryConfig repoConfig = new RepositoryConfig("test", "test", implConfig);
Model m = new

但是,根据我从工作台中的“编辑存储库”获得的信息,结果看起来不正确 . 除了id和title之外,所有值都是空的 .

This fails

我尝试从我在工作台上创建的现有存储库中复制设置,但失败了:

org.eclipse.rdf4j.repository.config.RepositoryConfigException: 
                         Unsupported repository type: owlim:MonitorRepository

该尝试的代码的灵感来自于here . 除了配置文件基于现有的repo,如上所述 . 我也试过配置示例中提供的文件,但是失败了:

org.eclipse.rdf4j.repository.config.RepositoryConfigException: 
       Unsupported Sail type: graphdb:FreeSail

有人有任何提示吗?

UPDATE 正如Henriette Harmse正确指出的那样,我应该提供我的代码,而不仅仅是与它相关联 . 这样我可能会发现我毕竟没有完成一个完整的副本,但改变了她在答案中指出的重要的第一位 . 完整代码如下:

String address = "serveradr";
RemoteRepositoryManager repositoryManager = new RemoteRepositoryManager( address);
repositoryManager.initialize();

// Instantiate a repository graph model
TreeModel graph = new TreeModel();
InputStream config = Rdf4jHelper.class.getResourceAsStream("/repoconf2.ttl");
RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE);
rdfParser.setRDFHandler(new StatementCollector(graph));
rdfParser.parse(config, RepositoryConfigSchema.NAMESPACE);
config.close();

// Retrieve the repository node as a resource
Resource repositoryNode = graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY).subjects().iterator().next();

// Create a repository configuration object and add it to the repositoryManager
RepositoryConfig repositoryConfig = RepositoryConfig.create(graph, repositoryNode);

它在最后一行失败了 .

ANSWERED @HenrietteHarmse在下面的回答中提供了正确的方法 . 错误是由缺少依赖项引起的 . 我应该使用graphdb-free-runtime,而不是直接使用RDF4J .

2 回答

  • 1

    这里有很多问题:

    (1) RepositoryManager repositoryManager = new LocalRepositoryManager(new File(".")); 将创建一个运行Java应用程序的存储库 .

    (2)仅当GraphDB未运行时,更改为 new LocalRepositoryManager(new File("$GraphDBInstall/data/repositories")) 将导致在GraphDB的控制下创建存储库(假设您有本地GraphDB实例) . 如果在运行程序后启动GraphDB,则可以在GraphDB工作台中查看存储库 .

    (3)您需要做的是获取远程GraphDB的存储库管理器,可以使用 RepositoryManager repositoryManager = RepositoryProvider.getRepositoryManager("http://IPAddressOfGraphDB:7200"); 来完成 .

    (4)在指定配置的方式中,导致RDF图配置丢失 . 指定它的正确方法是:

    RepositoryConfig repositoryConfig = RepositoryConfig.create(graph, repositoryNode);
    repositoryManager.addRepositoryConfig(repositoryConfig);
    

    (5)一个小问题是 GraphUtil.getUniqueSubject(...) 已被弃用,您可以使用以下内容:

    Model model = graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY);
    Iterator<Statement> iterator = model.iterator(); 
    if (!iterator.hasNext()) 
       throw new RuntimeException("Oops, no <http://www.openrdf.org/config/repository#> subject found!");
    Statement statement = iterator.next();
    Resource repositoryNode =  statement.getSubject();
    

    EDIT 在20180408:

    (5)或者您可以使用@JeenBroekstra在评论中建议的紧凑选项:

    Models.subject(
        graph.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY))
        .orElseThrow(() -> new RuntimeException("Oops, no <http://www.openrdf.org/config/repository#> subject found!"));
    

    EDIT 在20180409:

    为方便起见,我添加了完整的代码示例here .

    EDIT 在20180410:

    所以真正的罪魁祸首竟然是错误的 pom.xml . 正确的版本如下:

    <dependency>
      <groupId>com.ontotext.graphdb</groupId>
      <artifactId>graphdb-free-runtime</artifactId>
      <version>8.4.1</version>
    </dependency>
    
  • 0

    我相信我遇到了同样的问题 . 我使用GraphDB Free中的示例代码与RDF4J作为远程服务运行并遇到了与您相同的异常(Unsupported Sail type:graphdb:FreeSail) . Henriette Harmse的回答没有直接解决这个问题,但应该遵循那里给出的建议,以避免以后遇到问题 . 另外,基于对RDF4J代码的研究,您需要在 pom.xml 文件中使用以下依赖项(假设GraphDB 8.5):

    <dependency>
        <groupId>com.ontotext.graphdb</groupId>
        <artifactId>graphdb-free-runtime</artifactId>
        <version>8.5.0</version>
    </dependency>
    

    这似乎是因为META-INF正在进行某种服务加载,我坦白地说这并不熟悉 . 也许有人可以在评论中提供更多细节 . 添加此依赖关系的要求似乎也没有出现在说明书中,所以如果这对你有用,请告诉我 . 其他遵循我们所做步骤的人应该能够解决这个问题 .

相关问题