使用 RDF4J 在远程服务器上创建存储库
Create a repository on a remote server with RDF4J
我一直在尝试使用 RDF4J 在远程 GraphDB 服务器上创建一个新的存储库,但我遇到了问题。
这可以运行,但似乎不正确
HTTPRepositoryConfig implConfig = new HTTPRepositoryConfig(address);
RepositoryConfig repoConfig = new RepositoryConfig("test", "test", implConfig);
Model m = new
但是,根据我在 workbench 中从 "edit repository" 获得的信息,结果看起来不正确。除了 id 和 title 之外,所有值都是空的。
这失败了
我试图从我在 workbench 上创建的现有存储库中复制设置,但失败了:
org.eclipse.rdf4j.repository.config.RepositoryConfigException:
Unsupported repository type: owlim:MonitorRepository
该尝试的代码受到发现的代码的启发 here 。除了配置文件基于现有的 repo 之外,如上所述。我还尝试配置示例中提供的文件,但也失败了:
org.eclipse.rdf4j.repository.config.RepositoryConfigException:
Unsupported Sail type: graphdb:FreeSail
有人有什么建议吗?
更新
正如 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);
最后一行失败。
已回答 @HenrietteHarmse 在下面的回答中给出了正确的方法。该错误是由于缺少依赖项引起的。我应该使用 graphdb-free-runtime,而不是直接使用 RDF4J。
这里有很多问题:
(1) RepositoryManager repositoryManager = new LocalRepositoryManager(new File("."));
将创建一个存储库,您的 Java 应用程序来自 运行。
(2) 仅当 GraphDB 不是 运行 时,更改为 new LocalRepositoryManager(new File("$GraphDBInstall/data/repositories"))
将导致在 GraphDB 的控制下创建存储库(假设您有一个本地 GraphDB 实例)。如果您在 运行 您的程序之后启动 GraphDB,您将能够在 GraphDB workbench.
中看到存储库
(3) 你需要做的是获取远程GraphDB的repository manager,这可以通过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();
在 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!"));
在 20180409 上编辑:
为方便起见,我添加了完整的代码示例here。
编辑 20180410:
原来真正的罪魁祸首是不正确的pom.xml
。正确版本如下:
<dependency>
<groupId>com.ontotext.graphdb</groupId>
<artifactId>graphdb-free-runtime</artifactId>
<version>8.4.1</version>
</dependency>
我想我也遇到了同样的问题。我将 GraphDB Free 中的示例代码用于 运行 RDF4J 作为远程服务,并将 运行 用于与您相同的异常(不支持的 Sail 类型: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 正在进行某种服务加载,我 f运行kly 不熟悉。也许有人可以在评论中提供更多细节。说明中似乎也没有添加此依赖项的要求,因此如果这对您有用,请告诉我。其他按照我们所做的相同步骤操作的人应该也能解决这个问题。
我一直在尝试使用 RDF4J 在远程 GraphDB 服务器上创建一个新的存储库,但我遇到了问题。
这可以运行,但似乎不正确
HTTPRepositoryConfig implConfig = new HTTPRepositoryConfig(address);
RepositoryConfig repoConfig = new RepositoryConfig("test", "test", implConfig);
Model m = new
但是,根据我在 workbench 中从 "edit repository" 获得的信息,结果看起来不正确。除了 id 和 title 之外,所有值都是空的。
这失败了
我试图从我在 workbench 上创建的现有存储库中复制设置,但失败了:
org.eclipse.rdf4j.repository.config.RepositoryConfigException:
Unsupported repository type: owlim:MonitorRepository
该尝试的代码受到发现的代码的启发 here 。除了配置文件基于现有的 repo 之外,如上所述。我还尝试配置示例中提供的文件,但也失败了:
org.eclipse.rdf4j.repository.config.RepositoryConfigException:
Unsupported Sail type: graphdb:FreeSail
有人有什么建议吗?
更新 正如 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);
最后一行失败。
已回答 @HenrietteHarmse 在下面的回答中给出了正确的方法。该错误是由于缺少依赖项引起的。我应该使用 graphdb-free-runtime,而不是直接使用 RDF4J。
这里有很多问题:
(1) RepositoryManager repositoryManager = new LocalRepositoryManager(new File("."));
将创建一个存储库,您的 Java 应用程序来自 运行。
(2) 仅当 GraphDB 不是 运行 时,更改为 new LocalRepositoryManager(new File("$GraphDBInstall/data/repositories"))
将导致在 GraphDB 的控制下创建存储库(假设您有一个本地 GraphDB 实例)。如果您在 运行 您的程序之后启动 GraphDB,您将能够在 GraphDB workbench.
(3) 你需要做的是获取远程GraphDB的repository manager,这可以通过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();
在 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!"));
在 20180409 上编辑:
为方便起见,我添加了完整的代码示例here。
编辑 20180410:
原来真正的罪魁祸首是不正确的pom.xml
。正确版本如下:
<dependency>
<groupId>com.ontotext.graphdb</groupId>
<artifactId>graphdb-free-runtime</artifactId>
<version>8.4.1</version>
</dependency>
我想我也遇到了同样的问题。我将 GraphDB Free 中的示例代码用于 运行 RDF4J 作为远程服务,并将 运行 用于与您相同的异常(不支持的 Sail 类型: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 正在进行某种服务加载,我 f运行kly 不熟悉。也许有人可以在评论中提供更多细节。说明中似乎也没有添加此依赖项的要求,因此如果这对您有用,请告诉我。其他按照我们所做的相同步骤操作的人应该也能解决这个问题。