每当我开始使用sql时,我倾向于在数据库中抛出几个探索性语句,以便了解什么是可用的,以及数据采用何种形式.
例如.
show tables
describe table
select * from table
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我理解使用SPARQL端点完成对rdf数据存储的类似探索的方法吗?
谢谢 :)
Tom*_*ris 81
嗯,显而易见的第一个开始是查看数据中存在的类和属性.
以下是如何查看正在使用的类:
SELECT DISTINCT ?class
WHERE {
?s a ?class .
}
LIMIT 25
OFFSET 0
Run Code Online (Sandbox Code Playgroud)
(LIMIT并且OFFSET有用于分页.特别是如果你通过互联网发送你的查询,这是值得习惯的.我会在其他例子中省略它们.)
a是一种特殊的SPARQL(和Notation3/Turtle)语法来表示rdf:type谓词 - 这将单个实例链接到owl:Class/ rdfs:Classtypes(大致相当于SQL RDBMSes中的表).
其次,你想看看属性.您可以使用您搜索过的类或只查找属性来执行此操作.让我们从商店中获取所有商品:
SELECT DISTINCT ?property
WHERE {
?s ?property ?o .
}
Run Code Online (Sandbox Code Playgroud)
这将获得您可能不感兴趣的所有属性.这相当于SQL中所有行列的列表,但没有按表进行任何分组.
更有用的是查看声明特定类的实例正在使用哪些属性:
SELECT DISTINCT ?property
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
}
Run Code Online (Sandbox Code Playgroud)
这将使您回到在满足第一个三元组的任何实例上使用的属性 - 即具有rdf:typeof的http://xmlns.com/foaf/0.1/Person.
请记住,因为rdf:Resource可以有多个rdf:type属性 - 如果你愿意的话 - 并且因为RDF的数据模型是附加的,你没有钻石问题.这种类型只是另一种属性 - 它只是一个有用的社会协议,说有些东西是人或狗或基因或足球队.这并不意味着数据存储将包含通常与该类型相关联的属性.该类型不保证资源可能具有的属性.
您需要熟悉数据模型以及SPARQL的UNION和OPTIONAL语法的使用.rdf:type到SQL表的粗略映射就是那么粗糙.
您可能想知道属性指向的实体类型.首先,您可能想知道数据类型属性 - 相当于文字或基元.你知道,字符串,整数等.RDF将这些文字定义为从字符串继承的所有文字.我们可以使用SPARQL过滤器方法过滤掉那些属于文字的属性isLiteral:
SELECT DISTINCT ?property
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
FILTER isLiteral(?o)
}
Run Code Online (Sandbox Code Playgroud)
我们在这里只获取具有文字的属性 - 字符串,日期时间,布尔值或其他XSD数据类型之一.
但是非文字对象呢?将这个非常简单的伪Java类定义视为一个类比:
public class Person {
int age;
Person marriedTo;
}
Run Code Online (Sandbox Code Playgroud)
使用上面的查询,如果绑定了age属性,我们将返回表示age的文字.但是,结果不是原始的(即RDF术语中的文字) - 它是对另一个对象的引用 - 在RDF/OWL术语中,这是一个对象属性.但我们不知道那些属性(谓词)引用了哪种对象.此查询将返回带有附带类型的属性(其?o值为其成员的类).
SELECT DISTINCT ?property, ?class
WHERE {
?s a <http://xmlns.com/foaf/0.1/Person>;
?property ?o .
?o a ?class .
FILTER(!isLiteral(?o))
}
Run Code Online (Sandbox Code Playgroud)
这应该足以让自己定位在特定的数据集中.当然,我还建议您只需提取一些资源并进行检查.您可以使用DESCRIBE查询执行此操作:
DESCRIBE <http://example.org/resource>
Run Code Online (Sandbox Code Playgroud)
有一些SPARQL工具 - 例如SNORQL - 允许您在浏览器中执行此操作.我链接到的SNORQL实例有一个示例查询,用于探索可能的命名图,我在这里没有介绍过.
如果您不熟悉SPARQL,老实说,如果遇到问题,最好的资源就是规范.它是一个W3C规范,但是非常好(它们构建了一个不错的测试套件,因此您可以实际看到实现是否正确完成)并且如果您可以克服复杂的语言,那么它非常有用.
小智 7
我发现以下一组探索性查询很有用:
看到课程:
select distinct ?type ?label
where {
?s a ?type .
OPTIONAL { ?type rdfs:label ?label }
}
Run Code Online (Sandbox Code Playgroud)
看到属性:
select distinct ?objprop ?label
where {
?objprop a owl:ObjectProperty .
OPTIONAL { ?objprop rdfs:label ?label }
}
Run Code Online (Sandbox Code Playgroud)
查看数据属性:
select distinct ?dataprop ?label
where {
?dataprop a owl:DatatypeProperty .
OPTIONAL { ?dataprop rdfs:label ?label }
}
Run Code Online (Sandbox Code Playgroud)
查看实际使用的属性:
select distinct ?p ?label
where {
?s ?p ?o .
OPTIONAL { ?p rdfs:label ?label }
}
Run Code Online (Sandbox Code Playgroud)
查看断言的实体:
select distinct ?entity ?elabel ?type ?tlabel
where {
?entity a ?type .
OPTIONAL { ?entity rdfs:label ?elabel } .
OPTIONAL { ?type rdfs:label ?tlabel }
}
Run Code Online (Sandbox Code Playgroud)
查看使用中的不同图表:
select distinct ?g where {
graph ?g {
?s ?p ?o
}
}
Run Code Online (Sandbox Code Playgroud)