Thank you for that answer, Dave! I think this provides the missing link in my understanding of the matter.
Is there a single method call to use when copying the inference model to a plain model or do I need to make copies of every triple myself and add them to a new model? > Den 3. jul. 2021 kl. 18.34 skrev Dave Reynolds <[email protected]>: > > > On 02/07/2021 13:29, Simon Gray wrote: >> Hmm… I am not sure how my rules are modeled. I just use the built-in >> OWL_MEM_MICRO_RULE_INF OntModelSpec. >> Anyway, my question is still this: how do I get all of those inferences >> computed *before* I start querying the Model. It’s great if I can just store >> them later, but I still need to *compute* them before I can think about >> persisting anything. Running a single query doesn’t seem to compute them >> all, just relevant ones to that specific query… I think? > > Short answer is there's no built in way to precompute everything that's > precomputable for the OWL reasoners other than that which the others have > pointed out - copy the inferred model. > > The OWL rules use a mix of forward and backward reasoning. The forward > reasoning can all be invoked in one go via prepare() but the backward > reasoning is mostly done on demand. Some of the backward rules are > tabled/memoized so once they've been run once future runs are supposed to be > quicker. Others are always run on demand. > > If you have a few particular query patterns then to warm up the relevant > memoization run those queries. > > The most comprehensive way to ensure everything has been computed is to copy > the model to a plain model (in memory or persistent). That copy is > essentially running the query (?s ?p ?o) and will compute everything the > rules can reach. After that the inference model is as warm as it's going to > get. But since that that point you've already materialized everything then > might as well keep the materialized copy as the others have said. > > There'd be nothing to doing the general query (e.g. via an unbounded > listStatements()) call and throwing the results away. That *could* be > beneficial if the materialized model is too big but the tabling/memoization > is proving useful and smaller - but no guarantees. > > Dave > >>> Den 2. jul. 2021 kl. 14.06 skrev Lorenz Buehmann >>> <[email protected]>: >>> >>> But can't you do this inference just once and then somewhere store those >>> inferences? Next time you can simply load the inferred model instead of the >>> raw dataset. It is not specific to TDB, you can load dataset A, compute the >>> inferred model in a slow process once, materialize it as dataset B, and >>> later on always work on dataset B - this is standard forward chaining with >>> writing the data back to disk or database. Can you try this procedure, >>> maybe it works for you? >>> >>> Indeed this wont work if your rules are currently modeled as backward >>> chaining rules as those are computed at query time always. >>> >>> >>> On 02.07.21 13:37, Simon Gray wrote: >>>> Thank you Lorenz, although this seems to be a reply to my side comment >>>> about TDB rather than the question I had, right? >>>> >>>> The main issue right now is that I would like to use inferencing to get >>>> e.g. inverse relations, but doing this is very slow the first time a query >>>> is run, likely due to some preprocessing step that needs to run first. I >>>> would like to run the preprocessing step in advance rather than running it >>>> implicitly. >>>> >>>>> Den 2. jul. 2021 kl. 13.30 skrev Lorenz Buehmann >>>>> <[email protected]>: >>>>> >>>>> you can just add the inferred model to the dataset, i.e. add all triple >>>>> to your TDB. Then you can disable the reasoner afterwards or just omit >>>>> the rules that you do not need anymore >>>>> >>>>> On 02.07.21 13:13, Simon Gray wrote: >>>>>> Hi there, >>>>>> >>>>>> I’m using Apache Jena from Clojure to create new home for the Danish >>>>>> WordNet. I use the Arachne Aristotle library + some additional Java >>>>>> interop code of my own. >>>>>> >>>>>> I would like to use OWL inferencing to query e.g transitive or inverse >>>>>> relations. This does seem to work fine although I’ve only tried using >>>>>> the supplied in-memory model for now (and it looks like I will have to >>>>>> create my own instance of a ModelMaker to integrate with TDB 1 or 2). >>>>>> >>>>>> However, the first query always seems to run really, really slow. Is >>>>>> there any way to precompute inferred relations so that I don’t have to >>>>>> wait? I’ve tried calling `rebind` and `prepare`, but they don’t seem to >>>>>> do anything. >>>>>> >>>>>> Kind regards, >>>>>> >>>>>> Simon Gray >>>>>> Research Officer >>>>>> Centre for Language Technology, University of Copenhagen >>>>>> >>>>
