我使用通用规则推理器在 Apache Fuseki 4.9.0 中加载用户定义的规则失败。根据通用规则引擎配置参数,我应该能够在fuseki配置文件中执行此操作:
PREFIX : <#>
PREFIX fuseki: <http://jena.apache.org/fuseki#>
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 jr: <http://jena.hpl.hp.com/2003/JenaReasoner#>
PREFIX rr: <http://jena.hpl.hp.com/2003/RuleReasoner#>
PREFIX tdb: <http://jena.hpl.hp.com/2008/tdb#>
PREFIX tdb2: <http://jena.apache.org/2016/tdb#>
[] rdf:type fuseki:Server ; fuseki:services ( :service ) .
:service rdf:type fuseki:Service ;
fuseki:name "tutorial" ;
fuseki:serviceReadWriteGraphStore "data" ;
fuseki:endpoint [ fuseki:operation fuseki:query ; fuseki:name "query" ; ] ;
fuseki:endpoint [ fuseki:operation fuseki:update ; fuseki:name "update" ] ;
fuseki:dataset :dataset .
:dataset rdf:type ja:RDFDataset ; tdb:unionDefaultGraph true ; ja:defaultGraph :model_inf .
:model_inf a ja:InfModel ;
ja:baseModel :tdbGraph ;
ja:reasoner [
ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ;
rr:traceOn true ;
rr:derivationLogging true ;
rr:ruleMode 'forward' ;
rr:ruleSet <file:src/rules/mission.rules> ;
] .
:tdbGraph rdf:type tdb2:GraphTDB2 ; tdb2:dataset :tdbDataset .
:tdbDataset rdf:type tdb2:DatasetTDB2 ; tdb2:location "--mem--" .
为了确认 Fuseki 加载了规则文件,我在
src/rules/mission.rules
中插入了一个拼写错误:
# This should include jena-core/src/main/resources/etc/owl-fb.rules
# How do we specify this file as an @include <...> directive?
@prefix mission: <http://example.com/tutorial/vocabulary/mission#>
@prefix oml: <http://opencaesar.io/oml#>
[missionPresents:
(?r ?x rdf:type mission:Presents),
(?r oml:hasSource ?s),
(?r oml:hasTarget ?t)
->
(?s mission:presents ?t)
]
错误出现在第一个三元组中,它是一个四元组:
(?r ?x rdf:type mission:Presents)
。
在 Windows 10 上使用 Apache Fuseki 4.9.0,我没有遇到上述错误。
我从此更改了配置:
ja:reasoner [
ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ;
rr:traceOn true ;
rr:derivationLogging true ;
rr:ruleMode 'forward' ;
rr:ruleSet <file:src/rules/mission.rules> ;
] .
对此:
ja:reasoner [
ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ;
rr:traceOn true ;
rr:derivationLogging true ;
rr:ruleMode 'forward' ;
ja:rulesFrom <file:src/rules/mission.rules> ;
] .
我使用包含以下内容的
log4j2.properties
文件启动 Fuseki:
logger.rulesys.name = org.apache.jena.reasoner.rulesys
logger.rulesys.level = ALL
这表明 Fuseki 在处理检测到语法错误的
ja:rulesFrom
指令之前加载预定义规则:
09:29:19 INFO Server :: Apache Jena Fuseki 4.9.0
09:29:19 INFO Server :: Incoming connections limited to localhost
09:29:19 INFO Server :: jetty-10.0.15; built: 2023-04-11T17:25:14.480Z; git: 68017dbd00236bb7e187330d7585a059610f661d; jvm 17.0.2+8-86
09:29:20 INFO StandardDescriptorProcessor :: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
09:29:20 INFO DefaultSessionIdManager :: Session workerName=node0
09:29:20 INFO Config :: FUSEKI_HOME=...
09:29:20 INFO Config :: FUSEKI_BASE=...
09:29:20 INFO org_apache_jena_fuseki_Servlet :: Initializing Shiro environment
09:29:20 INFO EnvironmentLoader :: Starting Shiro environment initialization.
09:29:20 INFO Config :: Shiro file: file://...
09:29:20 WARN IniRealm :: Users or Roles are already populated. Configured Ini instance will be ignored.
09:29:20 INFO EnvironmentLoader :: Shiro environment initialized in 207 ms.
09:29:20 DEBUG FBRuleInfGraph :: Adding rule [ (?a rdfs:isDefinedBy ?b) -> (?a rdfs:seeAlso ?b) ]
09:29:20 DEBUG FBRuleInfGraph :: Adding rule [ (?x rdf:rest ?y) -> (?y rdf:type rdf:List) ]
09:29:20 DEBUG FBRuleInfGraph :: Adding rule [ (?x rdfs:label ?y) -> (?y rdf:type rdfs:Literal) ]
09:29:20 DEBUG FBRuleInfGraph :: Adding rule [ (?x rdfs:comment ?y) -> (?y rdf:type rdfs:Literal) ]
...
09:29:20 DEBUG FBRuleInfGraph :: Adding rule [ (?x <http://jena.hpl.hp.com/2005/11/Assembler#literalContent> ?y) -> (?x rdf:type <http://jena.hpl.hp.com/2005/11/Assembler#ContentItem>) ]
09:29:20 DEBUG FBRuleInfGraph :: Adding rule [ (?x <http://jena.hpl.hp.com/2005/11/Assembler#contentEncoding> ?y) -> (?x rdf:type <http://jena.hpl.hp.com/2005/11/Assembler#ContentItem>) ]
09:29:21 ERROR Server :: Exception in initialization: caught: Triple with 4 nodes!
At '[ missionPresents: ( ?r ?x rdf:type mission:Presents ) '
09:29:21 WARN WebAppContext :: Failed startup of context o.e.j.w.WebAppContext@23468512{Apache Jena Fuseki Server,/,file://...,UNAVAILABLE}
org.apache.jena.assembler.exceptions.AssemblerException: caught: Triple with 4 nodes!
At '[ missionPresents: ( ?r ?x rdf:type mission:Presents ) '
at org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.openBySpecificType(AssemblerGroup.java:165) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.open(AssemblerGroup.java:144) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$ExpandingAssemblerGroup.open(AssemblerGroup.java:93) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:39) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:35) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.InfModelAssembler.getReasonerFactory(InfModelAssembler.java:53) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.InfModelAssembler.getReasoner(InfModelAssembler.java:46) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.InfModelAssembler.openEmptyModel(InfModelAssembler.java:34) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.ModelAssembler.openModel(ModelAssembler.java:38) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.ModelAssembler.open(ModelAssembler.java:60) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.openBySpecificType(AssemblerGroup.java:157) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.open(AssemblerGroup.java:144) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$ExpandingAssemblerGroup.open(AssemblerGroup.java:93) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:39) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:35) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup.openModel(AssemblerGroup.java:47) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.sparql.core.assembler.DatasetAssemblerGeneral.createDataset(DatasetAssemblerGeneral.java:50) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.sparql.core.assembler.DatasetAssembler.open(DatasetAssembler.java:40) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.sparql.core.assembler.DatasetAssembler.open(DatasetAssembler.java:33) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.openBySpecificType(AssemblerGroup.java:157) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.open(AssemblerGroup.java:144) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$ExpandingAssemblerGroup.open(AssemblerGroup.java:93) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:39) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:35) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.build.FusekiConfig.getDataset(FusekiConfig.java:647) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.build.FusekiConfig.buildDataService(FusekiConfig.java:410) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.build.FusekiConfig.buildDataAccessPoint(FusekiConfig.java:397) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.build.FusekiConfig.servicesAndDatasets$(FusekiConfig.java:302) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.build.FusekiConfig.processServerConfiguration(FusekiConfig.java:196) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.webapp.FusekiWebapp.processServerConfigFile(FusekiWebapp.java:282) ~[jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.webapp.FusekiWebapp.initServerConfiguration(FusekiWebapp.java:242) ~[jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.webapp.FusekiWebapp.initializeDataAccessPoints(FusekiWebapp.java:220) ~[jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.webapp.FusekiServerListener.serverInitialization(FusekiServerListener.java:96) ~[jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.webapp.FusekiServerListener.contextInitialized(FusekiServerListener.java:57) ~[jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:1049) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:624) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.server.handler.ContextHandler.contextInitialized(ContextHandler.java:984) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:740) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:392) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1304) ~[jetty-webapp-10.0.15.jar:10.0.15]
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:901) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:306) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:532) [jetty-webapp-10.0.15.jar:10.0.15]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:89) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.server.handler.gzip.GzipHandler.doStart(GzipHandler.java:221) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.server.Server.start(Server.java:470) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:89) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.server.Server.doStart(Server.java:415) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.cmd.JettyFusekiWebapp.start(JettyFusekiWebapp.java:119) [jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.cmd.FusekiCmd.runFuseki(FusekiCmd.java:388) [jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.cmd.FusekiCmd$FusekiCmdInner.exec(FusekiCmd.java:372) [jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.cmd.CmdMain.mainMethod(CmdMain.java:87) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.cmd.CmdMain.mainRun(CmdMain.java:56) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.cmd.CmdMain.mainRun(CmdMain.java:43) [jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.cmd.FusekiCmd$FusekiCmdInner.innerMain(FusekiCmd.java:100) [jena-fuseki-webapp-4.9.0.jar:4.9.0]
at org.apache.jena.fuseki.cmd.FusekiCmd.main(FusekiCmd.java:65) [jena-fuseki-webapp-4.9.0.jar:4.9.0]
Caused by: org.apache.jena.reasoner.rulesys.Rule$ParserException: Triple with 4 nodes!
At '[ missionPresents: ( ?r ?x rdf:type mission:Presents ) '
at org.apache.jena.reasoner.rulesys.Rule$Parser.parseClause(Rule.java:1016) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.reasoner.rulesys.Rule$Parser.doParseRule(Rule.java:1073) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.reasoner.rulesys.Rule$Parser.parseRule(Rule.java:1046) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.reasoner.rulesys.Rule.parseRules(Rule.java:664) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.reasoner.rulesys.Rule.rulesFromURL(Rule.java:513) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.reasoner.rulesys.Rule.rulesFromURL(Rule.java:524) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.RuleSetAssembler.addExternalRules(RuleSetAssembler.java:62) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.RuleSetAssembler.addRules(RuleSetAssembler.java:42) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.ReasonerFactoryAssembler.addRules(ReasonerFactoryAssembler.java:96) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.ReasonerFactoryAssembler.open(ReasonerFactoryAssembler.java:50) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
at org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.openBySpecificType(AssemblerGroup.java:157) ~[jena-fuseki-server-4.9.0.jar:4.9.0]
... 62 more
这表明,尽管有配置文档,但
rr:ruleSet
会被忽略,但 ja:rulesFrom
会被处理。
接下来,我修正了规则中的拼写错误,使其格式正确:
@prefix mission: <http://example.com/tutorial/vocabulary/mission#>
@prefix oml: <http://opencaesar.io/oml#>
[missionPresents:
(?r rdf:type mission:Presents),
(?r oml:hasSource ?s),
(?r oml:hasTarget ?t)
->
(?s mission:presents ?t)
]
Fuseki 日志显示加载所有预定义规则,但没有迹象表明它加载了上面的
missionPresents
规则。
如果没有错误,为什么我们看不到规则加载?
文档和 Apache Jena 源代码都有通过 API 加载的用户定义规则的示例,但不通过 Fuseki 配置文件加载。
更重要的是,有人建议如何加载规则并确认其已加载吗?
我应该期待什么样的日志
rr:traceOn true ;
?
我应该期待
rr:derivationLogging true ;
收到什么样的日志消息?
这部分服务说明:
:dataset rdf:type ja:RDFDataset ;
tdb:unionDefaultGraph true ;
ja:defaultGraph :model_inf .
表示默认图无法查询。相反,默认是所有命名图的并集视图(没有命名图 - 所以它是一个空视图)。