Hi Martynas,

On 17/10/16 21:51, Martynas Jusevičius wrote:

I realized I mis-used "read-only" in b). I want to make changes, but
only in the throw-away per-request Model.

I am currently testing such version:

            return ModelFactory.createOntologyModel(ontModelSpec,


If, as I understand, it makes changes to the first Model only, which
is not stored anywhere then it might be what I need. Unless I'm
missing something?

Yes, if you just want to be able add data and see the result but don't need any inference closure over it then a dynamic union is a good way to go.


It returns a slightly different triple count, but so far I haven't
noticed any problems. And it runs way faster, in the order of

On Mon, Oct 17, 2016 at 10:43 PM, Dave Reynolds
<dave.e.reyno...@gmail.com> wrote:
If you are using rules then they are likely to be a significant part of the
overhead of accessing the cloned model.

In which case it would make sense to materialize your OntModel as a
no-inference OntModel and then copy that whenever you need to. That will
mean that if you update your cloned copy you won't see additional inferences
but given your mention of option (b) presumably you don't mean to change the
data anyway.


On 17/10/16 20:36, Martynas Jusevičius wrote:


I am looking for a way to either
a) clone an OntModel in a performant way
b) make OntModel instance in OntDocumentManager read-only

The use case goes like this: JAX-RS retrieves an OntModel instance
from OntModel manager per each request, adds to it or changes it, and
discards it after the request.

We cannot directly change the OntModel instance in OntDocumentManager,
because that would pollute it with changes from each request and the
size would grow very quickly.

So I went for the easy way out and cloned the OntModel on each
request, like this:

        OntModel ontModel =

        // lock and clone the model to avoid
            Model baseModel =
            OntModel clonedModel =
ModelFactory.createOntologyModel(ontModelSpec, baseModel);
            if (log.isDebugEnabled()) log.debug("Sitemap model size:
{}", clonedModel.size());
            return clonedModel;

That works, but the problem is that cloning using add() performs very
poorly. According to my profiling, this code takes almost a second to
execute with under 6000 statements, spent mostly in hasNext() of
various iterators.

Not sure if it's relevant, but the OntModelSpec uses GenericRuleReasoner.

Is there a faster way or can you maybe suggest a different approach



Reply via email to