如何在fuseki配置中加载用户定义的规则?

问题描述 投票:0回答:1

我使用通用规则推理器在 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 ;
收到什么样的日志消息?

jena
1个回答
0
投票

这部分服务说明:

:dataset rdf:type ja:RDFDataset ;
       tdb:unionDefaultGraph true ;
       ja:defaultGraph :model_inf .

表示默认图无法查询。相反,默认是所有命名图的并集视图(没有命名图 - 所以它是一个空视图)。

© www.soinside.com 2019 - 2024. All rights reserved.