【发布时间】:2021-11-02 10:57:46
【问题描述】:
我在实现内置 jena-fuseki 推理器时遇到了一些问题,我可以让它工作,但它不会阻止我添加不正确的三元组。所以我想将 Openllet 推理器添加到我的 jena-fuseki 服务器。
但我不知道如何将 openllet jar 添加到我的 Docker 映像并使其工作,我遇到了许多 java 依赖问题。 要添加上下文,我的 docker-compose 看起来像这样:
jena-fuseki-server:
hostname: jena-fuseki
build:
context: .
dockerfile: server.Dockerfile
restart: always
ports:
- 3030:3030
environment:
- ADMIN_PASSWORD=admin
- FUSEKI_DATASET_1=ds
我的 server.Dockerfile 看起来像这样,我正在做的是将我的配置/本体文件复制到我的图像以及我的 openllet jar 中,然后我试图执行它产生这个问题:
jena-fuseki-server_1 | /bin/sh: 1: [java,: not found
FROM stain/jena-fuseki:4.0.0
#This is made to stop Issue with JVM locks
RUN apt-get update; \
apt-get install -y --no-install-recommends procps
RUN mkdir -p /fuseki/ontologies/
RUN mkdir -p /fuseki/configuration/
RUN mkdir -p /fuseki/inference/
RUN mkdir -p /fuseki
WORKDIR /fuseki
COPY server/openllet inference
COPY server/configuration configuration
COPY server/test ontologies
CMD ["java", "-jar", inference/openllet-distribution-2.6.5-sources.jar]
我的配置文件调用灵感来自this,没有 tdb,因为我现在只是在测试,她看起来像这样并且为 OWLMini + Generic 工作
@prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .
<#service1> rdf:type fuseki:Service ;
fuseki:name "ds" ; # http://host:port/ds
fuseki:serviceQuery "sparql" ; # SPARQL query service
fuseki:serviceQuery "query" ; # SPARQL query service (alt name)
fuseki:serviceUpdate "update" ; # SPARQL update service
fuseki:serviceUpload "upload" ; # Non-SPARQL upload service
fuseki:serviceReadWriteGraphStore "data" ; # SPARQL Graph store protocol (read and write)
# A separate read-only graph store endpoint:
fuseki:serviceReadGraphStore "get" ; # SPARQL Graph store protocol (read only)
fuseki:dataset <#dataset> ;
.
<#dataset> rdf:type ja:RDFDataset ;
ja:defaultGraph <#modelInf> ;
.
<#modelInf> rdf:type ja:InfModel ;
ja:content [ja:externalContent <file:/fuseki/ontologies/server_famille.ttl> ; ] ;
ja:reasoner [
ja:reasonerClass "openllet.jena.PelletReasonerFactory" ; ]
.
我正在使用家族本体进行测试,
你还尝试了什么?
我一直在尝试下面链接中描述的事情,其中大部分已经解决,并导致我不得不考虑其他问题:
- fuseki-how-to-add-pellet-reasoner
- 在 docker permissions-jena 中将 jar 添加到 jena home (/jena-fuseki)
- cant-get-openllet-running-on-fuseki
- 尝试在 docker 中安装 open jdk 但无法运行 apt-get jdk 8
我也经常遇到这个问题
初始化时出现错误异常:无法加载对象 34064d96e625bd1f4718dc614ac47d38 [ja:reasoner of file:///fuseki/configuration/db_tdb.ttl#modelInf] 所需的类 'openllet.jena.PelletReasonerFactory'
人们通常将 Openllet 用于 maven 或与 Java 项目结合使用,但我只使用配置文件和后端 API 进行调用,一切都按照我向您展示的内容进行配置。
由于我还是 docker 和 jena-fuseki 的新手,这可能是我正在尝试做的一个概念问题,所以如果您知道我应该在哪里寻找更多信息,我将非常感激。
【问题讨论】:
-
如果您使用
CMD的 JSON 数组形式,则每个单词都需要用双引号括起来。由于您拥有的不是有效的 JSON 数组,因此 Docker 回退到使用 shell 处理它,从而导致[java错误。双引号CMD中的 jar 文件名可以解决您的问题吗? -
@DavidMaze 它解决了我的一个问题,但后来我得到了
no main manifest attribute我发现openllet-distribution-2.6.5-sources有一个空的清单文件但没有original-openllet-distribution-2.6.5.jar并且仍然运行同样的问题,因为它是另一个话题,我可能会尝试自己解决这个问题,然后再回来。感谢您的解释,它帮助我了解了 CMD 的工作原理 =)
标签: docker docker-compose jena inference fuseki