You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Rui Zhang <zh...@pnw.edu> on 2017/06/20 21:05:02 UTC

Reasoner works on named graphs

Hi,
I face a problem, when I try to let my reasoner work on specific graph.
The process is this:
1. Initial the server by the attached ttl file. The file information is
attached below.
2. I know that the inference model has been built after initialization, and
I can use sparql to insert and select data by using fuseki.
    if I insert data into default graph, the inference results could be
obtained.
    The question is that, if inserting data into new graphs, I can not make
the reasoner work on these graph any more, I'm trying to find a way to
solve  it, because I want to clear the specific graph data and then insert
new information data frequently, and I also want to keep some basic
knowledge data in the default graph.
3. In the ttl configuration file, the "tdb:unionDefaultGraph true" is set,
the expected result should be the data from the union named graphs, if
selecting data in default. But the result is still from the original
default graph.

Could you help me figure out these problem?

Thanks and hoping for your reply!

Georege

@prefix fuseki:  <http://jena.apache.org/fuseki#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
## ---------------------------------------------------------------
[] ja:loadClass "org.apache.jena.tdb.TDB" .
tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
tdb:GraphTDB    rdfs:subClassOf  ja:Model .

[] rdf:type fuseki:Server ;
   # Timeout - server-wide default: milliseconds.
   # Format 1: "1000" -- 1 second timeout
   # Format 2: "10000,60000" -- 10s timeout to first result, then 60s
timeout for the rest of query.
   # See java doc for ARQ.queryTimeout
   # ja:context [ ja:cxtName "arq:queryTimeout" ;  ja:cxtValue "10000" ] ;

   # ja:loadClass "your.code.Class" ;

   fuseki:services (
     <#reminer1>
   ) .

## ---------------------------------------------------------------
## Updatable in-memory dataset.
<#reminer1> rdf:type fuseki:Service ;
    # URI of the dataset -- http://host:port/reminer1
    fuseki:name                        "/test" ;
    fuseki:serviceQuery                "sparql" ;
    fuseki:serviceQuery                "query" ;
    fuseki:serviceUpdate               "update" ;
    fuseki:serviceUpload               "upload" ;
    fuseki:serviceReadWriteGraphStore  "data" ;
    fuseki:serviceReadGraphStore       "get" ;
    fuseki:dataset                     <#rdf_dataset> ;
    .


## In-memory, initially empty.
## This database set-up allows OWL inference.


<#rdf_dataset> rdf:type ja:RDFDataset ;
    ja:defaultGraph <#infGraph>;
    ##ja:defaultGraph <#modelDft>;
    .

<#infGraph> rdf:type ja:InfModel ;
        ja:reasoner [ ja:reasonerURL <http://jena.hpl.hp.com/2003/
GenericRuleReasoner> ];
        ja:rules: [ja:rulesFrom <file:./../rules/graphTest.rules>; ];
        ja:baseModel <#tdbGraph>;
    .

<#tdbGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#tdb_datset> ;
    tdb:graphName <Graph_Test>;
    .

<#tdb_datset> rdf:type tdb:DatasetTDB ;
    tdb:location "db" ;
    tdb:unionDefaultGraph true ;
    .
## ---------------------------------------------------------------

Re: Reasoner works on named graphs

Posted by Dave Reynolds <da...@gmail.com>.
On 21/06/17 16:36, Andy Seaborne wrote:
> Hi Rui,
> 
> It is not currently possible to have newly created graph automatically 
> be inference graphs.
> 
> What sort of rules do you have in mind? forward or backward?
> 
> ----
> 
> I took a look at what it might take: it needs coding. (Dave, please 
> check what I discovered when you have a moment (!!)).

Not sure I fully understand Rui's use case but ...

> DatasetGraphMap is the basic implementation of DatasetGraph which is a 
> collection individual graph.  One argument to the constructor is a 
> GraphMaker.
> 
> So provide a GraphMaker that adds the inference capabalities makes a new 
> Graph which is the inference graph over

I think Rui needs inference over a union of all the graphs in his TDB 
rather than separate per-graph inference, but wants to be able to update 
graphs separately through fuseki. If so then he may not need the full 
dynamic construction of new InfGraphs and so might not need GraphMakers.

> This is making some assumptions:
> 
> * Inference does not span graphs.
> * It's not inference over a default union graph - that has other 
> considerations.
> * The rules set isn't changing.
> 
> There is a specific issue for default union graph when changes happen. 
> It is not going to see the changes that go into a named graph directly 
> as it bypasses the default union graph.
> 
> The GraphMaker create graph need to call InfGraph.rebind() when the 
> transaction commit occurs (in Fuseki, there is always a commit - it's 
> always a transaction).

Yes, exactly. If the updates go into the TDB directly then the InfGraph 
(over the union) doesn't see the changes and would need a rebind() call.

In theory someone could write a new Dataset implementation that acted as 
a wrapper over a TDB plus a single InfGraph. The InfGraph would be 
configured with the TDB default union graph as it's base. The wrapper 
could  pass updates to the TDB but present the InfGraph as its default 
graph. Any updates would need to trigger a rebind of InfGraph.

However, I see little value in that because the rebind() will cause the 
reasoner to start over and loose all the prior work so performance would 
be terrible.

Fundamentally the current inference engines are not well suited to a 
world of TDB-backed named graphs :(

Dave

> On 20/06/17 22:05, Rui Zhang wrote:
>> Hi,
>> I face a problem, when I try to let my reasoner work on specific graph.
>> The process is this:
>> 1. Initial the server by the attached ttl file. The file information is
>> attached below.
>> 2. I know that the inference model has been built after 
>> initialization, and
>> I can use sparql to insert and select data by using fuseki.
>>      if I insert data into default graph, the inference results could be
>> obtained.
>>      The question is that, if inserting data into new graphs, I can 
>> not make
>> the reasoner work on these graph any more, I'm trying to find a way to
>> solve  it, because I want to clear the specific graph data and then 
>> insert
>> new information data frequently, and I also want to keep some basic
>> knowledge data in the default graph.
> 
> 
> 
>> 3. In the ttl configuration file, the "tdb:unionDefaultGraph true" is 
>> set,
>> the expected result should be the data from the union named graphs, if
>> selecting data in default. But the result is still from the original
>> default graph.
>>
>> Could you help me figure out these problem?
>>
>> Thanks and hoping for your reply!
>>
>> Georege
>>
>> @prefix fuseki:  <http://jena.apache.org/fuseki#> .
>> @prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>> @prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
>> @prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
>> @prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
>> ## ---------------------------------------------------------------
>> [] ja:loadClass "org.apache.jena.tdb.TDB" .
>> tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
>> tdb:GraphTDB    rdfs:subClassOf  ja:Model .
>>
>> [] rdf:type fuseki:Server ;
>>     # Timeout - server-wide default: milliseconds.
>>     # Format 1: "1000" -- 1 second timeout
>>     # Format 2: "10000,60000" -- 10s timeout to first result, then 60s
>> timeout for the rest of query.
>>     # See java doc for ARQ.queryTimeout
>>     # ja:context [ ja:cxtName "arq:queryTimeout" ;  ja:cxtValue 
>> "10000" ] ;
>>
>>     # ja:loadClass "your.code.Class" ;
>>
>>     fuseki:services (
>>       <#reminer1>
>>     ) .
>>
>> ## ---------------------------------------------------------------
>> ## Updatable in-memory dataset.
>> <#reminer1> rdf:type fuseki:Service ;
>>      # URI of the dataset -- http://host:port/reminer1
>>      fuseki:name                        "/test" ;
>>      fuseki:serviceQuery                "sparql" ;
>>      fuseki:serviceQuery                "query" ;
>>      fuseki:serviceUpdate               "update" ;
>>      fuseki:serviceUpload               "upload" ;
>>      fuseki:serviceReadWriteGraphStore  "data" ;
>>      fuseki:serviceReadGraphStore       "get" ;
>>      fuseki:dataset                     <#rdf_dataset> ;
>>      .
>>
>>
>> ## In-memory, initially empty.
>> ## This database set-up allows OWL inference.
>>
>>
>> <#rdf_dataset> rdf:type ja:RDFDataset ;
>>      ja:defaultGraph <#infGraph>;
>>      ##ja:defaultGraph <#modelDft>;
>>      .
>>
>> <#infGraph> rdf:type ja:InfModel ;
>>          ja:reasoner [ ja:reasonerURL <http://jena.hpl.hp.com/2003/
>> GenericRuleReasoner> ];
>>          ja:rules: [ja:rulesFrom <file:./../rules/graphTest.rules>; ];
>>          ja:baseModel <#tdbGraph>;
>>      .
>>
>> <#tdbGraph> rdf:type tdb:GraphTDB ;
>>      tdb:dataset <#tdb_datset> ;
>>      tdb:graphName <Graph_Test>;
>>      .
>>
>> <#tdb_datset> rdf:type tdb:DatasetTDB ;
>>      tdb:location "db" ;
>>      tdb:unionDefaultGraph true ;
>>      .
>> ## ---------------------------------------------------------------
>>

Re: Reasoner works on named graphs

Posted by Andy Seaborne <an...@apache.org>.
Hi Rui,

It is not currently possible to have newly created graph automatically 
be inference graphs.

What sort of rules do you have in mind? forward or backward?

----

I took a look at what it might take: it needs coding. (Dave, please 
check what I discovered when you have a moment (!!)).

DatasetGraphMap is the basic implementation of DatasetGraph which is a 
collection individual graph.  One argument to the constructor is a 
GraphMaker.

So provide a GraphMaker that adds the inference capabalities makes a new 
Graph which is the inference graph over

This is making some assumptions:

* Inference does not span graphs.
* It's not inference over a default union graph - that has other 
considerations.
* The rules set isn't changing.

There is a specific issue for default union graph when changes happen. 
It is not going to see the changes that go into a named graph directly 
as it bypasses the default union graph.

The GraphMaker create graph need to call InfGraph.rebind() when the 
transaction commit occurs (in Fuseki, there is always a commit - it's 
always a transaction).

	Andy


On 20/06/17 22:05, Rui Zhang wrote:
> Hi,
> I face a problem, when I try to let my reasoner work on specific graph.
> The process is this:
> 1. Initial the server by the attached ttl file. The file information is
> attached below.
> 2. I know that the inference model has been built after initialization, and
> I can use sparql to insert and select data by using fuseki.
>      if I insert data into default graph, the inference results could be
> obtained.
>      The question is that, if inserting data into new graphs, I can not make
> the reasoner work on these graph any more, I'm trying to find a way to
> solve  it, because I want to clear the specific graph data and then insert
> new information data frequently, and I also want to keep some basic
> knowledge data in the default graph.



> 3. In the ttl configuration file, the "tdb:unionDefaultGraph true" is set,
> the expected result should be the data from the union named graphs, if
> selecting data in default. But the result is still from the original
> default graph.
> 
> Could you help me figure out these problem?
> 
> Thanks and hoping for your reply!
> 
> Georege
> 
> @prefix fuseki:  <http://jena.apache.org/fuseki#> .
> @prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
> @prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
> @prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
> @prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
> ## ---------------------------------------------------------------
> [] ja:loadClass "org.apache.jena.tdb.TDB" .
> tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
> tdb:GraphTDB    rdfs:subClassOf  ja:Model .
> 
> [] rdf:type fuseki:Server ;
>     # Timeout - server-wide default: milliseconds.
>     # Format 1: "1000" -- 1 second timeout
>     # Format 2: "10000,60000" -- 10s timeout to first result, then 60s
> timeout for the rest of query.
>     # See java doc for ARQ.queryTimeout
>     # ja:context [ ja:cxtName "arq:queryTimeout" ;  ja:cxtValue "10000" ] ;
> 
>     # ja:loadClass "your.code.Class" ;
> 
>     fuseki:services (
>       <#reminer1>
>     ) .
> 
> ## ---------------------------------------------------------------
> ## Updatable in-memory dataset.
> <#reminer1> rdf:type fuseki:Service ;
>      # URI of the dataset -- http://host:port/reminer1
>      fuseki:name                        "/test" ;
>      fuseki:serviceQuery                "sparql" ;
>      fuseki:serviceQuery                "query" ;
>      fuseki:serviceUpdate               "update" ;
>      fuseki:serviceUpload               "upload" ;
>      fuseki:serviceReadWriteGraphStore  "data" ;
>      fuseki:serviceReadGraphStore       "get" ;
>      fuseki:dataset                     <#rdf_dataset> ;
>      .
> 
> 
> ## In-memory, initially empty.
> ## This database set-up allows OWL inference.
> 
> 
> <#rdf_dataset> rdf:type ja:RDFDataset ;
>      ja:defaultGraph <#infGraph>;
>      ##ja:defaultGraph <#modelDft>;
>      .
> 
> <#infGraph> rdf:type ja:InfModel ;
>          ja:reasoner [ ja:reasonerURL <http://jena.hpl.hp.com/2003/
> GenericRuleReasoner> ];
>          ja:rules: [ja:rulesFrom <file:./../rules/graphTest.rules>; ];
>          ja:baseModel <#tdbGraph>;
>      .
> 
> <#tdbGraph> rdf:type tdb:GraphTDB ;
>      tdb:dataset <#tdb_datset> ;
>      tdb:graphName <Graph_Test>;
>      .
> 
> <#tdb_datset> rdf:type tdb:DatasetTDB ;
>      tdb:location "db" ;
>      tdb:unionDefaultGraph true ;
>      .
> ## ---------------------------------------------------------------
>