Lorenz, no, the base model is not sufficient for the kinds of queries I'm
using. I need inferred statements with RDF reasoning. --Andy

On Thu, Jan 25, 2018 at 2:35 AM, Lorenz Buehmann <
[email protected]> wrote:

> Does getBaseModel() [1] not work or is this not what need?
>
>
> Lorenz
>
>
> [1]
> https://jena.apache.org/documentation/javadoc/jena/
> org/apache/jena/ontology/OntModel.html#getBaseModel--
>
> On 25.01.2018 06:28, Andrew Hunter wrote:
> > Hi,
> >
> > I have an OntModel using simple RDF reasoning, but I have found that
> > preparing the model and then copying it into a default, non-reasoning
> model
> > is much faster for querying. My immediate question: Is there an efficient
> > way of copying an OntModel into a default, non-reasoning model without
> > copying all statements?
> >
> > Some more details on my motivation, with a sketch of the code found
> below:
> > My OntModel is held in memory and is originally constructed from a set of
> > OWL files. I am matching a stream of data items, each with a small set of
> > RDF triples attached, against a few long standing queries. Conceptually,
> I
> > wish to insert a data item into the OntModel and then execute the queries
> > to see if that one item matches, then remove it from the model and wait
> for
> > the next item. Since there is only one item of interest at a time, I also
> > have the option of extracting a sub-model rooted at a resource
> identifying
> > the item, and using this much smaller model to query.
> >
> > What I have found is that by far the fastest way to complete query
> > execution is to perform all the reasoning on the ontology and data in the
> > OntModel, and then to make a copy of all its statements into a default
> > model, and query over the default model. Since I have several queries, I
> > actually extract a relevant sub-model using reachableClosure from
> > ResourceUtils and use this "sub" model. Both the querying and the closure
> > extraction are dramatically faster with the default model copy over the
> > OntModel (as I'm sure you all know).
> >
> > However, making the copy itself now takes 95+% of the total item matching
> > time. Hence my question: is there a faster way to make a copy, or
> reference
> > the statements in an OntModel as if they were part of a default model?
> > Alternatively, is there a way of "turning off" the inference functions
> when
> > querying (I see no API for this)? My limited understanding of the
> InfModel
> > and InfGraph indicates the statements are actually held in multiple
> graphs
> > (e.g., the base graph and the deductions graph) so it probably can't be
> as
> > easy as "get a reference to the list of statements/triples".
> >
> > I also tried implementing ModelChangedListener and GraphListener to
> extract
> > the statements being added by the reasoner and add those to the default
> > model, but these seem to only callback when new data is added from
> outside.
> > The idea was that I could add the large set of ontology-based inference
> > once for all at startup and just make small deltas based on new
> inferences
> > from the incoming data, but these small deltas were not reported to me.
> >
> > I would be most grateful for any ideas or pointers. In any case, best of
> > luck and thanks!
> >
> > Andy
> >
> >
> > A sketch of my current code:
> >
> > // Block executed once at startup
> > OntModel fullModel = ModelFactory.createOntologyModel(
> > OntModelSpec.OWL_LITE_MEM_RDFS_INF);
> > // load ontology files into fullModel with something like
> > for (each owl file) { fullModel.add( ... ); }
> > // perform inference over onotlogy
> > fullModel.prepare();
> > // end startup block
> >
> > ...
> >
> > // new data arrives
> > fullModel.add( [[model from data string]] );
> > // perform inference on new data + ontology
> > fullModel.prepare();
> > // make a copy into a default model
> > Model copyModel = ModelFactory.createDefaultModel();
> > copyModel.add(fullModel);
> > // extract relevant sub-model
> > Model subModel = ResourceUtils.reachableClosure(copyModel
> > .getResource("some:root:data:id:uri"));
> >
> > // query uses relevant default model
> > QueryExection qe = QueryExecutionFactory.create(queryString, subModel);
> >
> > // execSelect, process results, cleanup, wait for new data, etc.
> >
>
>

Reply via email to