Test Inferences

This document describes how inferences are performed with the Fuseki triplestore in the MICA project. It also defines a framework based on Junit to test that inferences are correctly performed.

Configure fuseki server to support inferences

  1. connect to server hosting fuseki (e.g. lig-coin)
  2. go to fuseki homedir (e.g. /srv/fuseki/)
  3. edit config.ttl and add
    • @prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> .
    • declare additional assembler items.
        # Declaration additional assembler items.
         [] ja:loadClass "org.apache.jena.tdb.TDB" .
      
         # TDB
        tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
        tdb:GraphTDB    rdfs:subClassOf  ja:Model .

    After these modifications the config.ttl file looks like:

    # Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0
    
    ## Fuseki Server configuration file.
    
    @prefix :        <#> .
    @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 ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
    @prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
    
    [] rdf:type fuseki:Server .
       # Example::
       # Server-wide query timeout.   
       # 
       # 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 javadoc for ARQ.queryTimeout for details.
       # This can also be set on a per dataset basis in the dataset assembler.
       #
       # ja:context [ ja:cxtName "arq:queryTimeout" ;  ja:cxtValue "30000" ] ;
    
       # Add any custom classes you want to load.
       # Must have a "public static void init()" method.
       # ja:loadClass "your.code.Class" ;   
    
       # End triples.
       # Declaration additional assembler items.
       [] ja:loadClass "org.apache.jena.tdb.TDB" .
    
       # TDB
      tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
      tdb:GraphTDB    rdfs:subClassOf  ja:Model .

Test SKOS inferences

  1. Create an empty data set : testMicaOntolgy
  2. Create the rules file MICA.rules
    1. connect to server hosting fuseki (e.g. ssh lig-coin)
    2. go to fuseki homedir (e.g. cd /srv/fuseki/)
    3. go to configuration directory (cd ./configuration)
    4. create the rules file MICA.rules

      The inference rules are created according to the model and the ontology.
      For example, a concept c1 has skos:broader a concept c2, it means that a concept c2 has skos:narrower a concept c1.
      the rule of this inference is the following:

      @prefix skos:  <http://www.w3.org/2004/02/skos/core#> .
      
      # R1: create the narrower property
      
      [broaderNarrowerRule: (?A skos:broader ?B) -> (?B  skos:narrower ?A) ]

      After you define all the rules, the rules file looks like this:

      @prefix skos:  <http://www.w3.org/2004/02/skos/core#> .
      @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
      @prefix micamodel: <https://w3id.org/mica/ontology/MicaModel#> .
      @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
      @prefix micavocab: <https://w3id.org/mica/ontology/MicaOntology/> .
      
      # R1: create the narrower property
      
      [broaderNarrowerRule: (?A skos:broader ?B) -> (?B  skos:narrower ?A) ]
      
      # R2: create the directly broaderTransitive property
      
      [broaderRule: (?A skos:broader ?B) -> (?A  skos:broaderTransitive ?B) ]
      
      # R3: create the hierarchical broaderTransitive property
      
      [broaderTransitiveRule: (?A skos:broaderTransitive ?B),(?B skos:broaderTransitive ?C) -> (?A  skos:broaderTransitive ?C) ]
      
      # R4: create the directly narrowerTransitive property
      
      [narrowerRule: (?A skos:narrower ?B) -> (?A  skos:narrowerTransitive ?B) ]
      
      # R5: create the hierarchical narrowerTransitive property
      
      [narrowerTransitiveRule: (?A skos:narrowerTransitive ?B),(?B skos:narrowerTransitive ?C) -> (?A  skos:narrowerTransitive ?C) ]
      
      # R6: create the reflexive broaderTransitive and narrowerTransitive
      
      [conceptReflexiveRule: (?A rdf:type skos:Concept) -> (?A skos:broaderTransitive ?A), (?A skos:narrowerTransitive ?A) ]
      
      # R7: create the symetric property for related concept
      
      [relatedRule: (?A  skos:related ?B) -> (?B skos:related ?A) ]
      
      # R8: create Heritage on data 
      
      [ dataHeritageRule: (?A  rdf:type  ?B ),(?B  rdfs:subClassOf ?C ) ->  (?A rdf:type ?C )]
      
      # R9: create heritage on class 
      
      [ subClassRule: (?A  rdfs:subClassOf  ?B ),(?B  rdfs:subClassOf ?C )->  (?A rdfs:subClassOf ?C )]
      
      # R10: create Heritage on property 
      
      [ propertyHeritageRule:  (?P rdfs:subPropertyOf ?Q ),(?A  ?P ?B )-> (?A ?Q ?B ) ]
      
      # R11: create the symetric property for relatedTo  MICAResource 
      
      [ relatedToRule: (?A  micamodel:relatedTo ?B) -> (?B micamodel:relatedTo ?A)]
      
      # R12: create the DomainConcept
      
      [ DomainConceptRule: (?A  rdf:type skos:Concept ),(?A  skos:inScheme micavocab:DomainScheme ) -> 
                                          (?A rdf:type micamodel:DomainConcept)]
      # R13: create the MethodConcept
      
      [ MethodConceptRule: (?A  rdf:type skos:Concept ),(?A  skos:inScheme micavocab:MethodScheme ) -> 
                                          (?A rdf:type micamodel:MethodConcept)]
      # R14: create the DataConcept
      
      [ DataConceptRule: (?A  rdf:type skos:Concept ),(?A  skos:inScheme micavocab:DataScheme ) -> 
                                          (?A rdf:type micamodel:DataConcept)]
      # R15: create the TemporalConcept
      
      [ TemporalConceptRule: (?A  rdf:type skos:Concept ),(?A  skos:inScheme micavocab:TemporalScheme ) -> 
                                          (?A rdf:type micamodel:TemporalConcept)]
      
      # R16: create the SpatialConcept
      
      [ SpatialConceptRule: (?A  rdf:type skos:Concept ),(?A  skos:inScheme micavocab:SpatialScheme ) -> 
                                          (?A rdf:type micamodel:SpatialConcept)]
      
      # R17:create the CommodityConcept
      
      [ CommodityConceptRule: (?A  rdf:type skos:Concept ),(?A  skos:inScheme micavocab:CommodityScheme ) -> 
                                          (?A rdf:type micamodel:CommodityConcept)]
      
      # R18: create the ValueSupplyChainConcept
      
      [ ValueSupplyChainConceptRule: (?A  rdf:type skos:Concept ),(?A  skos:inScheme micavocab:ValueSupplyChainScheme ) -> 
                                          (?A rdf:type micamodel:ValueSupplyChainConcept)]
      
  3. Configure fuseki in order to automatically perform some SKOS inferences when adding tripples to testMicaOntolgy
    1. connect to server hosting fuseki (e.g. ssh lig-coin)
    2. go to fuseki homedir (e.g. cd /srv/fuseki/)
    3. go to configuration directory (cd ./configuration)
    4. edit testMicaOntology.ttl

      replace

      :tdb_dataset_readwrite
              a             tdb:DatasetTDB ;
              tdb:location  "/srv/fuseki/databases/testMicaOntology" .

      by

      :tdb_dataset_readwrite rdf:type ja:RDFDataset ;
                    ja:defaultGraph :modelInf .
      
      :modelInf a ja:InfModel ;
                ja:reasoner [
                         ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ;
                         ja:rulesFrom <file:./MICA.rules> ;                   
                        ] ;
                ja:baseModel :dataGraph .
      
      
      :dataGraph a   tdb:GraphTDB ;
                     tdb:location "/srv/fuseki/databases/testMicaOntology" ;

      after these modifications testMicaOntolgy.ttl looks like

      @prefix :      <http://base/#> .
      @prefix tdb:   <http://jena.hpl.hp.com/2008/tdb#> .
      @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
      @prefix ja:    <http://jena.hpl.hp.com/2005/11/Assembler#> .
      @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
      @prefix fuseki: <http://jena.apache.org/fuseki#> .
      
      :service_tdb_all  a                   fuseki:Service ;
              rdfs:label                    "TDB testMicaOntology" ;
              fuseki:dataset                :tdb_dataset_readwrite ;
              fuseki:name                   "testMicaOntology" ;
              fuseki:serviceQuery           "query" , "sparql" ;
              fuseki:serviceReadGraphStore  "get" ;
              fuseki:serviceReadWriteGraphStore
                      "data" ;
              fuseki:serviceUpdate          "update" ;
              fuseki:serviceUpload          "upload" .
      
      
      :tdb_dataset_readwrite rdf:type ja:RDFDataset ;
                    ja:defaultGraph :modelInf .
      
      :modelInf a ja:InfModel ;
                ja:reasoner [
                         ja:reasonerURL <http://jena.hpl.hp.com/2003/GenericRuleReasoner> ;
                         ja:rulesFrom <file:./MICA.rules> ;                   
                        ] ;
                ja:baseModel :dataGraph .
      
      
      :dataGraph a   tdb:GraphTDB ;
                     tdb:location "/srv/fuseki/databases/testMicaOntology" ;
      
    5. restart fuseki server. For example using the tomcat manager: