RDF + OWL推理

时间:2018-07-05 19:23:27

标签: sql database rdf owl reasoning

让我们假设我有一个关于苏格拉底的RDF数据。数据如下所示

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

要检查苏格拉底是否是凡人,我有一个请求

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

然后我对“ Socrates”和“ mortal”进行了过滤,如果结果不为空,则Socrates为mortal。

它工作正常,但是我的老师要求添加OWL信息。

例如,如果我们有下一个数据

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

我的方法行不通,因为我们在链中还有其他步骤。

我需要在此处添加OWL静态数据,并实现对链中任意数量步骤的请求。

下一步是什么?

1 个答案:

答案 0 :(得分:3)

如果我们将您的示例数据转换为实际的RDF(使用Turtle语法),则会得到以下内容:

private async void button1_Click(object sender, EventArgs e) {
    label1.Text = "Please wait..."; //UI Thread
    var idlist = richTextBox1.Text.Split('\n'); //UI Thread
    var numbers = await GetWatchCountsAsync(idlist); //background thread(s) (non-blocking)
    richTextBox2.Text += string.Join(Environment.NewLine, numbers); // Back on UI thread
    label1.Text = "Done"; //UI Thread
}

如果将此数据上传到RDF数据库(例如RDF4J,Jena,GraphDB,Stardog,Blazegraph或其他许多选项),则可以使用以下SPARQL查询:

@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 .

这将检查ASK WHERE { :socrates rdf:type/rdfs:subClassOf* :Mortal } 的类型是:socrates还是:Mortal的(直接或间接)子类。如果苏格拉底是凡人,它将返回:Mortal,否则返回true。您甚至不需要推理机,只需使用查询语言的表现力即可。

如果RDF数据库支持基本的RDFS推理,则可以进一步简化查询:

false