renataleb
renataleb

Reputation: 21

RDF + OWL reasoning

Let's suppose I have an RDF data about Socrates. The data is shown below

subject, predicate, object
man, being, mortal
Socrates, being, man

To check whether Socrates is mortal I have a request

SELECT *
FROM RDFData t1
JOIN RDFData t2
ON t1.subject = t2.object

Then I have a filter on "Socrates" and "mortal" and if result is not empty, then Socrates is mortal.

It works fine, but my teacher asks to add OWL information.

For example, if we have the next data

subject, predicate, object
man, being, mortal
Socrates, being, Greek
Greek, being, man

My approach does not work, because we have additional step in the chain.

I need to add an OWL static data here and implement a request for arbitrary number of steps in the chain.

What are my next steps?

Upvotes: 0

Views: 282

Answers (1)

Jeen Broekstra
Jeen Broekstra

Reputation: 22042

If we turn your example data into actual RDF (using Turtle syntax), you'd get something like this:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <http://example.org/> .

:socrates rdf:type :Greek .
:Man rdfs:subClassOf :Mortal .
:Greek rdfs:subClassOf :Man .

If you upload this data into an RDF database (such as RDF4J, Jena, GraphDB, Stardog, Blazegraph, or a host of other options), you can use the following SPARQL query:

ASK WHERE { :socrates rdf:type/rdfs:subClassOf* :Mortal }

This checks if :socrates is of a type that is either :Mortal, or a (direct or indirect) subclass of :Mortal. It returns true if Socrates is a mortal, false otherwise. You don't even need a reasoner for this, you can just use the expressivity of the query language.

If your RDF database supports basic RDFS reasoning, you can simplify your query even further:

ASK WHERE { :socrates rdf:type :Mortal }

Upvotes: 3

Related Questions