thanks for your help Andy.
--
Daniel Maatari Okouya
Sent with Airmail
From: Andy Seaborne Andy Seaborne
Reply: [email protected] [email protected]
Date: December 13, 2013 at 11:54:32 AM
To: [email protected] [email protected]
Subject: Re: Jena TDB and Jena Inference cooperation underlying mechanics
On 13/12/13 08:26, Dave Reynolds wrote:
> If you want to save everything then do:
>
> tdbmodel.add( infmodel );
>
> Or, more completely,
>
> dataset.begin(ReadWrite.READ) ;
ReadWrite.WRITE :-)
> try {
> tdbmodel.add( infmodel );
> } finally { dataset.end() ; }
dataset.begin(ReadWrite.WRITE) ;
try {
Model tdbmodel = dataset.get....
tdbmodel.add( infmodel );
daatset.commit() ;
} finally { dataset.end() ; }
>
> Dave
>
> On 12/12/13 22:48, Daniel Maatari Okouya wrote:
>> Hi,
>>
>> Sorry to bother you again on that, but i tried to read online and still
>> i could not really figure out that last part. How to save back the
>> inferred triple in the TDB. After trying out few things, i realize that
>> as soon as you create an infgraph, many statement are already generated.
>> I use a Infgraph generated out of a pellet reasoner by the way. I just
>> understand how to proceed from there. “Generating the query saving back
>> the result” does not talk to me. Please could you explain further here.
>>
>> Many thanks,
>>
>> M
>> --
>> Daniel Maatari Okouya
>> Sent with Airmail <http://airmailapp.com/tracking>
>> ------------------------------------------------------------------------
>> From: Daniel Maatari Okouya Daniel Maatari Okouya
>> <mailto:[email protected]>
>> Reply: [email protected] [email protected]
>> <mailto:[email protected]>
>> Date: December 11, 2013 at 3:35:41 PM
>> To: [email protected] [email protected]
>> <mailto:[email protected]>
>> Subject: Re: Jena TDB and Jena Inference cooperation underlying mechanics
>>> I like that solution 3. This is something i had in mind before as
>>> well. I get it now.
>>>
>>> 1-However, how exactly can one add the information back into the
>>> ontology ? Do you have some example code ? From what i understood, you
>>> query the ontology, and then …… “I don’t understand”. Cause the result
>>> that you get, could very well contain both asserted triple and
>>> inferred triples. I come from the OWL-API. With it, there is clearly
>>> something called axiom generator, along with a clear procedure to add
>>> the inferred triple in the original ontology or any other ontology. Is
>>> there something similar in Jena ? Or simply how is it done, what is
>>> the best practice ?
>>> From your explanation it seems that you want only to generate those
>>> triples that are inferred out of the query, that’s interesting.
>>> In any case i would need some pointer for that procedure. Is there
>>> some code or example somewhere ?
>>>
>>> Many thanks,
>>> -M-
>>>
>>> --
>>> Daniel Maatari Okouya
>>> Sent with Airmail
>>> From: Dave Reynolds Dave Reynolds
>>> Reply: [email protected] [email protected]
>>> Date: December 11, 2013 at 1:29:48 PM
>>> To: [email protected] [email protected]
>>> Subject: Re: Jena TDB and Jena Inference cooperation underlying
>>> mechanics
>>> On 11/12/13 10:23, Daniel Maatari Okouya wrote:
>>> > Many thanks for taking the time to provide such a precise answer.
>>> >
>>> > Meanwhile, I’m afraid i would require some clarification.
>>> >
>>> >
>>> > 1- Could you explain the different between 1 and 2. To me the
>>> solution are exactly the same. With my current knowledge of Jena. I
>>> don’t see 2 different code coming out of "Construct an Infmodel over
>>> a TDB" and “Load The TDB model into memory”. In both case i would go
>>> with dataset.getNamedModel or getdefaultmodel, which to me would
>>> result in an in-memory model, that will be a parameter of a
>>> createInfModel…..
>>>
>>> No, a call like getNamedModel doesn't load the model into memory, it
>>> gives you an interface onto the TDB store. When you query that model the
>>> queries are sent to TDB.
>>>
>>> To create an in memory copy you would do something like:
>>>
>>> Model memCopy = ModelFactory.createDefaultModel();
>>> memCopy.add( tdbModel );
>>>
>>> > 2-In (3) I’m not familiar with the term "inference closure”. My
>>> guess would be that you mean ontology schema… is there another term
>>> for that, could you please clarify in easier jargon.
>>>
>>> Maybe a trivial example would help:
>>>
>>> Suppose you have an ontology, in a TDB model or a file, which states:
>>>
>>> foaf:knows rdfs:domain foaf:Person; rdfs:range foaf:Person .
>>>
>>> This is a small fragment of the FOAF vocabulary specification [1].
>>>
>>> Now suppose you have some instance data, again a TDB model or file,
>>> which only states:
>>>
>>> :dave foaf:knows :bob .
>>>
>>> The a query to list the types of :dave and :bob on that instance data
>>> will of itself return empty.
>>>
>>> However, if you construct an RDFS inference model which combines the
>>> ontology and the instance data with a knowledge of RDFS semantics then a
>>> query to that for type statements would yeild, among other things:
>>>
>>> :dave rdf:type foaf:Person .
>>> :bob rdf:type foaf:Person .
>>>
>>> These plus the ontology plus the instance data are the inference
>>> closure. I.e. the closure is what you get by adding back in all the new
>>> statements you can derive as a result of inference [2].
>>>
>>> The inference engine has had to do work to generate those additional
>>> inferred statements. All the internal reasoner state for doing so is in
>>> memory. So if you kill your application and ask the same query again the
>>> inference engine has to do that work over again. For more complex
>>> examples that work can be expensive, particularly over a persistent
>>> store.
>>>
>>> So in option 3 you take those inferred triples and store them, along
>>> with the original triples. If you list the rdf:type statements on that
>>> model now you see the same answers you would have seen if you queried
>>> via an inference engine but didn't have to do inference to get them (you
>>> did it ahead of time).
>>>
>>> Dave
>>>
>>> [1] http://xmlns.com/foaf/spec/#term_knows
>>>
>>> [2] Sometimes that complete closure can be infinite, so you can't infer
>>> and store everything. But in practice the fragments implemented by the
>>> rule engine are generally finite.
>>>
>>> > Moreover, I’m not sure to understand the full logic here. Why would
>>> i store the result of some query and then query them again. Is this
>>> the way to store all the inferredTriple back in the store? Do you
>>> mean that you take every triple that is returned and assert them back
>>> in the Infmodel or the base model ? By the way does that mean that in
>>> general, in jena, there is noway, to generate a model that is the
>>> combination of the asserted and all the inferred triple (or a
>>> selected set of inferred triple, e.g. all class axioms).
>>> >
>>> > As you can see i’m quite confuse ;) . I would much appreciate if
>>> you could clarified and detailed a bit further (3)
>>> >
>>> > Also if u have good pointers for me to read, please do not hesitate ;)
>>> >
>>> >
>>> > Many thanks,
>>> >
>>> > -M-
>>> >
>>> > --
>>> > Daniel Maatari Okouya
>>> > Sent with Airmail
>>> > From: Dave Reynolds Dave Reynolds
>>> > Reply: [email protected] [email protected]
>>> > Date: December 11, 2013 at 9:47:51 AM
>>> > To: [email protected] [email protected]
>>> > Subject: Re: Jena TDB and Jena Inference cooperation underlying
>>> mechanics
>>> > There's no specific integration of TDB and inference.
>>> >
>>> > The rule-based inference engines themselves run in memory but can
>>> > operate over any model, however it is stored. So there are several
>>> options.
>>> >
>>> > 1. Construct an InfModel over a TDB based model. When you query the
>>> > InfModel you will see both the TDB model and any inferences.
>>> >
>>> > 2. Load the TDB model into memory then construct an InfModel over
>>> that.
>>> > Then query the InfModel.
>>> >
>>> > 3. Prepare an inference closure and store that. Load the data, e.g.
>>> into
>>> > memory, construct the InfModel, query the InfModel for the patterns
>>> you
>>> > are interested in (which might be every triple) store all those
>>> results
>>> > in a TDB model. Then at run time open the closure TDB as a plain model
>>> > and query it.
>>> >
>>> > 4. As 3 but use TDB's high performance RDFS-subset closure.
>>> >
>>> > #1 is easy to do but the inference results are stored in memory so it
>>> > doesn't enable you to scale to models that wouldn't fit in memory
>>> anyway.
>>> >
>>> > #2 can be faster. Inference involves a lot of queries and query to
>>> an in
>>> > memory model is naturally faster than querying TDB. Whether the
>>> cost of
>>> > the initial load outweighs the speed of inference depends on how
>>> caching
>>> > works out, your data and your queries.
>>> >
>>> > #3 gives you good query performance at the cost of an expensive slow
>>> > cycle to prepare the data. It's not suited to mutating data and
>>> requires
>>> > the preparation phase to be run on a machine with enough memory to
>>> > compute the closure, or closure subset, that you want.
>>> >
>>> > #4 can cope with much larger data sets than #3 at the expense of a
>>> more
>>> > limited range of inference.
>>> >
>>> > Dave
>>> >
>>> >
>>> >
>>> > On 10/12/13 21:58, Daniel Maatari Okouya wrote:
>>> >> Dear All,
>>> >>
>>> >> If they can work together, I would like to understand a bit better
>>> the underlying mechanics of making Jena TDB and the Jena Inference
>>> infrastructure work together.
>>> >>
>>> >>
>>> >> Hence, I have the following question:
>>> >>
>>> >>
>>> >> 1-Can someone have the Jena TDB act like Stardog, in the sense
>>> that if one make a query that would include inferred triple as well ?
>>> >>
>>> >> If that is possible, can someone explain to me the underlying
>>> mechanics that it would imply, knowing that i understood the
>>> following from the documentation.
>>> >>
>>> >> Inferred triples are situated in an InfGraph/InfModel(warper),
>>> which is obtained by binding a reasoner to a base Graph/Model
>>> (understood as the one containing the asserted triples). One can
>>> query that infGraph using the Querry engine ( However this is
>>> happening on an InMemory models).
>>> >>
>>> >> My guess here is that if a model is in the TDB, then for our query
>>> to include the inferred triple, this would requires that, the querry
>>> to the model is actually run against the InfModel/Infgraph. However i
>>> don’t know if that is possible and how exactly TDB would do that?
>>> Indeed, that would mean choosing a reasoner, creating the infmodel,
>>> and exposing it in lieu of the base model.
>>> >>
>>> >> Can someone explain a bit that mechanics, that is how it works
>>> with Jena TDB, if one wants some inference. For instance, if the
>>> actual model is RDFS or OWL ? how to query it and obtain answer that
>>> include the inferred knowledge. Many thanks
>>> >>
>>> >> Best,
>>> >>
>>> >> -M-
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Daniel Maatari Okouya
>>> >> Sent with Airmail
>>> >>
>>> >
>>> >
>>>
>