让我们假设我有一个关于苏格拉底的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静态数据,并实现对链中任意数量步骤的请求。
下一步是什么?
答案 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