> 2/ It is not possible in an assembler/Fuseki configuration file, to create a > new named graph and have a another inference graph put around that new graph > at runtime.
Just to pull on one of these threads, my understanding is that this essentially because the assembler system works only by names. IOW, there's no such thing as a "variable", and a blank node doesn't function as a slot (as it might in a SPARQL query), just as an nameless node. So you have to know the specific name of any specific named graph to which you want to refer. A named graph that doesn't yet exist and may have any name at all when it does obviously doesn't fit into that. Andy and other more knowledgeable people: is that correct? If so, we might want to think about changing that as a _very long-term_ goal. Having the ability to refer to resources in assembler RDF by triple pattern or property matching or by some other means like that could be astoundingly powerful for a lot of these use cases that we see involving complex setups with multiple sources of data and inference. Yes, I realize that it would also be pretty gosh dang difficult (how do you know when to apply or re-apply the filtering/matching?) and might not be worth doing on those grounds alone, but I might file a ticket just to not forget the possibility. ajs6f > On Jan 31, 2019, at 12:41 PM, Andy Seaborne <[email protected]> wrote: > > Hi Pierre, > > A few points to start with: > > 1/ For my general understanding of how we might take the inferene provision > further in jena, what inferences are you particularly interested in? > > 2/ It is not possible in an assembler/Fuseki configuration file, to create a > new named graph and have a another inference graph put around that new graph > at runtime. > > 3/ The union graph can't be updated. It's a read-only union. > > 4/ "ERROR Exception in initialization: caught: Not in tramsaction" > Do you have the stacktrace for this? > > Inline questions about attempt 1. > > Andy > > > > On 31/01/2019 15:00, Pierre Grenon wrote: >> Hello, >> I am trying to: >> Set up Fuseki2 with inference and a TDB2 dataset in which can be persisted >> named graphs created with SPARQL Update. >> This is in order to: >> - maintain a set of ontologies in a named graph >> - maintain datasets in a number of named graphs >> - perform reasoning in the union graphs >> The assumption is that all data is persisted in a given TDB2 database. >> The higher purpose is to use reasoning over ontologies when querying over >> instance data located in named graphs. I think this is conceptually what is >> discussed here: >> Subject Re: Ontologies and model data >> Date Mon, 03 Jun 2013 20:26:18 GMT >> http://mail-archives.apache.org/mod_mbox/jena-users/201306.mbox/%[email protected]%3E >> The set up above is what comes across as a way of achieving this higher goal >> but I am not sure either that it is the best set up. Everything I have tried >> to do allows me to either perform inferences in <urn:x-arq:UnionGraph> or to >> persist triples in named graphs in a TDB2 database, but not both. >> My problem is: >> I cannot find a correct configuration that allows me to persist named graphs >> added to a TDB2 dataset and have inference at the same time. >> Some attempts are documented below. >> I have done most of my test in apache-jena-fuseki-3.8.0, my last tries were >> in apache-jena-fuseki-3.10.0. >> Would somebody be in a position to advise or provide a minimal working >> example? >> With many thanks and best regards, >> Pierre >> ### >> Attempt 1: >> # Example of a data service with SPARQL query abnd update on an >> # inference model. Data is taken from TDB. >> https://github.com/apache/jena/blob/master/jena-fuseki2/examples/service-inference-2.ttl >> which I have adapted to use TDB2 (which basically meant updating the >> namespace and the references to classes). >> Outcome: This allows me to load data into named graphs and to perform >> inferemce. However, it does not persist upon restarting the server. > > Did you enable tdb:unionDefaultGraph as well, load the named graph and the > access the union? > > What isn't persisted? Inferences or base data? >> ### >> Attempt 2: >> Define two services pointing to different graphs as advised in >> Subject Re: Persisting named graphs in TDB with jena-fuseki >> Date Thu, 10 Mar 2016 14:47:10 GMT >> http://mail-archives.apache.org/mod_mbox/jena-users/201603.mbox/%3cd30738c0.64a6f%[email protected]%3E >> Outcome: I could only manage de3fining two independent services on two >> independent datasets and couldn't figure out how to link the TDB2 and the >> Inference graphs. >> A reference to https://issues.apache.org/jira/browse/JENA-1122 >> is made in >> http://mail-archives.apache.org/mod_mbox/jena-users/201603.mbox/%[email protected]%3E >> But I do not understand what is said here. >> ### >> Attempt 3: >> I have found a config that seemed t make the link that was needed between >> graphs in Attempt 2 in: >> https://stackoverflow.com/questions/47568703/named-graphs-v-default-graph-behaviour-in-apache-jena-fuseki >> which I have adapted to TDB2. >> However, this gives me: >> ERROR Exception in initialization: caught: Not in tramsaction >> This also seems to have been a cut off point in the thread mentioned above >> Subject Re: Configuring fuseki with TDB2 and OWL reasoning >> Date Tue, 20 Feb 2018 10:55:13 GMT >> http://mail-archives.apache.org/mod_mbox/jena-users/201802.mbox/%3C6d37a8c7-aca1-4c1c-0cd3-fa041ecc07eb%40apache.org%3E >> This message refers to https://issues.apache.org/jira/browse/JENA-1492 >> which I do not understand but that comes across as having been resolved. >> Indeed, I tested the config attached to it (probably as minimal example for >> that issue) and it worked, but I don't think this is the config I need. >> #### ATTEMPT 3 Config >> @prefix : <http://base/#> . >> @prefix tdb2: <http://jena.apache.org/2016/tdb#> . >> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . >> @prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> . >> @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . >> @prefix fuseki: <http://jena.apache.org/fuseki#> . >> # TDB2 >> #tdb2:DatasetTDB2 rdfs:subClassOf ja:RDFDataset . >> #tdb2:GraphTDB rdfs:subClassOf ja:Model . >> # Service 1: Dataset endpoint (no reasoning) >> :dataService a fuseki:Service ; >> fuseki:name "tdbEnpoint" ; >> fuseki:serviceQuery "sparql", "query" ; >> fuseki:serviceUpdate "update" ; >> fuseki:dataset :tdbDataset ; >> . >> # Service 2: Reasoning endpoint >> :reasoningService a fuseki:Service ; >> fuseki:dataset :infDataset ; >> fuseki:name "reasoningEndpoint" ; >> fuseki:serviceQuery "query", "sparql" ; >> fuseki:serviceReadGraphStore "get" ; >> . >> # Inference dataset >> :infDataset rdf:type ja:RDFDataset ; >> ja:defaultGraph :infModel ; >> . >> # Inference model >> :infModel a ja:InfModel ; >> ja:baseModel :g ; >> ja:reasoner [ >> ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner> >> ; >> ] ; >> . >> # Intermediate graph referencing the default union graph >> :g rdf:type tdb2:GraphTDB ; >> tdb2:dataset :tdbDataset ; >> tdb2:graphName <urn:x-arq:UnionGraph> ; >> . >> # The location of the TDB dataset >> :tdbDataset rdf:type tdb2:DatasetTDB2 ; >> tdb2:location "C:\\dev\\apache-jena-fuseki-3.8.0\\run/databases/weird7" ; >> tdb2:unionDefaultGraph true ; >> . >> #### SERVER >> ... >> [2019-01-31 13:54:58] Config INFO Load configuration: >> file:///C:/dev/apache-jena-fuseki-3.10.0/run/configuration/weird7.ttl >> [2019-01-31 13:54:58] Server ERROR Exception in initialization: caught: >> Not in a transaction >> [2019-01-31 13:54:58] WebAppContext WARN Failed startup of context >> o.e.j.w.WebAppContext@6edc4161{Apache Jena Fuseki >> Server,/,file:///C:/dev/apache-jena-fuseki-3.10.0/webapp/,UNAVAILABLE} >> org.apache.jena.assembler.exceptions.AssemblerException: caught: Not in a >> transaction >> doing: >> root: >> file:///C:/dev/apache-jena-fuseki-3.10.0/run/configuration/weird7.ttl#model_inf >> with type: http://jena.hpl.hp.com/2005/11/Assembler#InfModel assembler >> class: class org.apache.jena.assembler.assemblers.InfModelAssembler >> root: http://base/#dataset with type: >> http://jena.hpl.hp.com/2005/11/Assembler#RDFDataset assembler class: class >> org.apache.jena.sparql.core.assembler.DatasetAssembler >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.openBySpecificType(AssemblerGroup.java:165) >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.open(AssemblerGroup.java:144) >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup$ExpandingAssemblerGroup.open(AssemblerGroup.java:93) >> at >> org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:39) >> at >> org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:35) >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup.openModel(AssemblerGroup.java:47) >> at >> org.apache.jena.sparql.core.assembler.DatasetAssembler.createDataset(DatasetAssembler.java:56) >> at >> org.apache.jena.sparql.core.assembler.DatasetAssembler.open(DatasetAssembler.java:43) >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.openBySpecificType(AssemblerGroup.java:157) >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.open(AssemblerGroup.java:144) >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup$ExpandingAssemblerGroup.open(AssemblerGroup.java:93) >> at >> org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:39) >> at >> org.apache.jena.assembler.assemblers.AssemblerBase.open(AssemblerBase.java:35) >> at >> org.apache.jena.fuseki.build.FusekiConfig.getDataset(FusekiConfig.java:345) >> at >> org.apache.jena.fuseki.build.FusekiConfig.buildDataService(FusekiConfig.java:299) >> at >> org.apache.jena.fuseki.build.FusekiConfig.buildDataAccessPoint(FusekiConfig.java:289) >> at >> org.apache.jena.fuseki.build.FusekiConfig.readConfiguration(FusekiConfig.java:272) >> at >> org.apache.jena.fuseki.build.FusekiConfig.readConfigurationDirectory(FusekiConfig.java:251) >> at >> org.apache.jena.fuseki.webapp.FusekiWebapp.initializeDataAccessPoints(FusekiWebapp.java:226) >> at >> org.apache.jena.fuseki.webapp.FusekiServerListener.serverInitialization(FusekiServerListener.java:98) >> at >> org.apache.jena.fuseki.webapp.FusekiServerListener.contextInitialized(FusekiServerListener.java:56) >> at >> org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:952) >> at >> org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:558) >> at >> org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:917) >> at >> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:370) >> at >> org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1497) >> at >> org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1459) >> at >> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:847) >> at >> org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:287) >> at >> org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:545) >> at >> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) >> at >> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138) >> at >> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108) >> at >> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) >> at >> org.eclipse.jetty.server.handler.gzip.GzipHandler.doStart(GzipHandler.java:410) >> at >> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) >> at >> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:138) >> at org.eclipse.jetty.server.Server.start(Server.java:416) >> at >> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:108) >> at >> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:113) >> at org.eclipse.jetty.server.Server.doStart(Server.java:383) >> at >> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) >> at >> org.apache.jena.fuseki.cmd.JettyFusekiWebapp.start(JettyFusekiWebapp.java:138) >> at org.apache.jena.fuseki.cmd.FusekiCmd.runFuseki(FusekiCmd.java:372) >> at >> org.apache.jena.fuseki.cmd.FusekiCmd$FusekiCmdInner.exec(FusekiCmd.java:356) >> at jena.cmd.CmdMain.mainMethod(CmdMain.java:93) >> at jena.cmd.CmdMain.mainRun(CmdMain.java:58) >> at jena.cmd.CmdMain.mainRun(CmdMain.java:45) >> at >> org.apache.jena.fuseki.cmd.FusekiCmd$FusekiCmdInner.innerMain(FusekiCmd.java:104) >> at org.apache.jena.fuseki.cmd.FusekiCmd.main(FusekiCmd.java:67) >> Caused by: org.apache.jena.dboe.transaction.txn.TransactionException: Not in >> a transaction >> at >> org.apache.jena.dboe.transaction.txn.TransactionalComponentLifecycle.checkTxn(TransactionalComponentLifecycle.java:417) >> at >> org.apache.jena.dboe.trans.bplustree.BPlusTree.getRootRead(BPlusTree.java:159) >> at >> org.apache.jena.dboe.trans.bplustree.BPlusTree.find(BPlusTree.java:239) >> at >> org.apache.jena.tdb2.store.nodetable.NodeTableNative.accessIndex(NodeTableNative.java:133) >> at >> org.apache.jena.tdb2.store.nodetable.NodeTableNative._idForNode(NodeTableNative.java:118) >> at >> org.apache.jena.tdb2.store.nodetable.NodeTableNative.getNodeIdForNode(NodeTableNative.java:57) >> at >> org.apache.jena.tdb2.store.nodetable.NodeTableCache._idForNode(NodeTableCache.java:222) >> at >> org.apache.jena.tdb2.store.nodetable.NodeTableCache.getNodeIdForNode(NodeTableCache.java:114) >> at >> org.apache.jena.tdb2.store.nodetable.NodeTableWrapper.getNodeIdForNode(NodeTableWrapper.java:47) >> at >> org.apache.jena.tdb2.store.nodetable.NodeTableInline.getNodeIdForNode(NodeTableInline.java:58) >> at >> org.apache.jena.tdb2.store.nodetupletable.NodeTupleTableConcrete.idForNode(NodeTupleTableConcrete.java:182) >> at >> org.apache.jena.tdb2.store.nodetupletable.NodeTupleTableConcrete.findAsNodeIds(NodeTupleTableConcrete.java:136) >> at >> org.apache.jena.tdb2.store.nodetupletable.NodeTupleTableConcrete.find(NodeTupleTableConcrete.java:114) >> at >> org.apache.jena.tdb2.store.DatasetPrefixesTDB.readPrefixMap(DatasetPrefixesTDB.java:111) >> at >> org.apache.jena.sparql.graph.GraphPrefixesProjection.getNsPrefixMap(GraphPrefixesProjection.java:94) >> at >> org.apache.jena.tdb2.store.GraphViewSwitchable$PrefixMappingImplTDB2.getNsPrefixMap(GraphViewSwitchable.java:159) >> at >> org.apache.jena.shared.impl.PrefixMappingImpl.setNsPrefixes(PrefixMappingImpl.java:138) >> at >> org.apache.jena.tdb2.store.GraphViewSwitchable.createPrefixMapping(GraphViewSwitchable.java:68) >> at >> org.apache.jena.graph.impl.GraphBase.getPrefixMapping(GraphBase.java:165) >> at >> org.apache.jena.reasoner.BaseInfGraph.getPrefixMapping(BaseInfGraph.java:55) >> at >> org.apache.jena.rdf.model.impl.ModelCom.getPrefixMapping(ModelCom.java:1018) >> at >> org.apache.jena.rdf.model.impl.ModelCom.setNsPrefixes(ModelCom.java:1055) >> at >> org.apache.jena.assembler.assemblers.ModelAssembler.open(ModelAssembler.java:45) >> at >> org.apache.jena.assembler.assemblers.AssemblerGroup$PlainAssemblerGroup.openBySpecificType(AssemblerGroup.java:157) >> ... 49 more >> [2019-01-31 13:54:58] Server INFO Started 2019/01/31 13:54:58 GMT on >> port 3030 >> THIS E-MAIL MAY CONTAIN CONFIDENTIAL AND/OR PRIVILEGED INFORMATION. >> IF YOU ARE NOT THE INTENDED RECIPIENT (OR HAVE RECEIVED THIS E-MAIL >> IN ERROR) PLEASE NOTIFY THE SENDER IMMEDIATELY AND DESTROY THIS >> E-MAIL. ANY UNAUTHORISED COPYING, DISCLOSURE OR DISTRIBUTION OF THE >> MATERIAL IN THIS E-MAIL IS STRICTLY FORBIDDEN. >> IN ACCORDANCE WITH MIFID II RULES ON INDUCEMENTS, THE FIRM'S EMPLOYEES >> MAY ATTEND CORPORATE ACCESS EVENTS (DEFINED IN THE FCA HANDBOOK AS >> "THE SERVICE OF ARRANGING OR BRINGING ABOUT CONTACT BETWEEN AN INVESTMENT >> MANAGER AND AN ISSUER OR POTENTIAL ISSUER"). DURING SUCH MEETINGS, THE >> FIRM'S EMPLOYEES MAY ON NO ACCOUNT BE IN RECEIPT OF INSIDE INFORMATION >> (AS DESCRIBED IN ARTICLE 7 OF THE MARKET ABUSE REGULATION (EU) NO 596/2014). >> (https://www.handbook.fca.org.uk/handbook/glossary/G3532m.html) >> COMPANIES WHO DISCLOSE INSIDE INFORMATION ARE IN BREACH OF REGULATION >> AND MUST IMMEDIATELY AND CLEARLY NOTIFY ALL ATTENDEES. FOR INFORMATION >> ON THE FIRM'S POLICY IN RELATION TO ITS PARTICIPATION IN MARKET SOUNDINGS, >> PLEASE SEE https://www.horizon-asset.co.uk/market-soundings/. >> HORIZON ASSET LLP IS AUTHORISED AND REGULATED >> BY THE FINANCIAL CONDUCT AUTHORITY.
