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