NikSp
NikSp

Reputation: 1549

Access subclassOf/subclassOf level using ForwardChainingRDFSInferencer with SPARQL

I am running some SPARQL queries using the class ForwardChainingRDFSInferencer, which basic constructs an inferencer. For my examples I use the schema.org ontology.

My code looks like the following example

MemoryStore store = new MemoryStore();
ForwardChainingRDFSInferencer inferencer = new ForwardChainingRDFSInferencer(store); //the inference class

Repository repo = new SailRepository(inferencer);
repo.initialize();

URL data = new URL("file:/home/user/Documents/schemaorg-current-https.nt");
            
RDFFormat fileRDFFormat = RDFFormat.NTRIPLES;
            
RepositoryConnection con = repo.getConnection();

con.add(data, null, fileRDFFormat);
    
System.out.println("Repository loaded");

String queryString =
    " PREFIX schema: <https://schema.org/>" +
    " SELECT DISTINCT ?subclassName_one" +
    " WHERE { " +
    "     ?type rdf:type rdfs:Class ." +
    "     ?type rdfs:subClassOf/rdfs:subClassOf? schema:Thing ." +
    "     ?type rdfs:label ?subclassName_one ." +
    " }";

TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();

while (result.hasNext()) {
    BindingSet bindingSet = result.next();
    System.out.println(bindingSet.toString());
    stdout.println(bindingSet.toString());
}
repo.close()

What I want is to print two subclass levels down the class Thing. So if for example we have,

Thing > Action (sub-class 1) > ConsumeAction (sub-class 2) > DrinkAction

What I want is to return the class CosumeAction which is two levels (subclasses) down from class Thing, while using the inference java class.

The current query, as given in the code sample above, returns all the classes and subclasses from every class of the schema.org ontology. Thus, there is something that I do wrong while using the inference class.

Upvotes: 1

Views: 170

Answers (1)

You could remove the classes you are not interested in with FILTER NOT EXISTS:

FILTER NOT EXISTS { 
  ?type rdfs:subClassOf+/rdfs:subClassOf/rdfs:subClassOf schema:Thing . 
}

Examples

For DrinkAction (level 3):

FILTER NOT EXISTS { 
  ?type              
    rdfs:subClassOf+ / # schema:ConsumeAction
    rdfs:subClassOf /  # schema:Action
    rdfs:subClassOf      schema:Thing . 
}

For WearAction (level 4):

FILTER NOT EXISTS { 
  ?type              
    rdfs:subClassOf+ / # schema:UseAction / schema:ConsumeAction
    rdfs:subClassOf /  # schema:Action
    rdfs:subClassOf      schema:Thing . 
}

Upvotes: 1

Related Questions