探索性的SPARQL查询?
每当我开始使用SQL时,我倾向于在数据库中抛出一些探索性语句来理解什么是可用的,以及数据的forms。
例如。
show tables describe table select * from table
任何人都可以帮助我理解使用SPARQL端点来完成rdf数据存储的类似探索的方法吗?
谢谢 :)
那么,明显的第一步就是看数据中的类和属性。
以下是如何查看正在使用的类:
SELECT DISTINCT ?class WHERE { ?sa ?class . } LIMIT 25 OFFSET 0
( LIMIT
和OFFSET
用于分页,如果你通过Internet发送你的查询,这个值得习惯,在其他例子中,我将省略它们)。
a
是一个特殊的SPARQL(和Notation3 / Turtle )语法来表示rdf:type
谓词 – 它将单个实例链接到owl:Class
/ rdfs:Class
types(大致相当于SQL RDBMS中的表)。
其次,你想看看属性。 您可以通过使用您search的类或仅查找属性来执行此操作。 让我们把所有的物业都拿出来
SELECT DISTINCT ?property WHERE { ?s ?property ?o . }
这将获得您可能不感兴趣的所有属性。这相当于SQL中所有行列的列表,但没有表的任何分组。
更有用的是查看声明特定类的实例正在使用的属性:
SELECT DISTINCT ?property WHERE { ?sa <http://xmlns.com/foaf/0.1/Person>; ?property ?o . }
这将使您回到任何满足第一个三元组的实例上使用的属性,即具有http://xmlns.com/foaf/0.1/Person
的rdf:type
。
记住,因为一个rdf:Resource可以有多个rdf:type属性 – 类,如果你愿意的话,并且因为RDF的数据模型是可叠加的,所以你没有钻石问题。 这种types只是另一个属性 – 这只是一个有用的社会协议,说有些东西是人或狗或基因或橄榄球队。 这并不意味着数据存储将包含通常与该types相关的属性。 types不保证任何资源可能具有的属性。
您需要熟悉数据模型以及使用SPARQL的UNION和OPTIONAL语法。 rdf:type到SQL表的粗略映射就是这样粗略的。
您可能想知道该房产指向哪种实体。 首先,你可能想知道数据types的属性 – 相当于文字或基元。 你知道,string,整数等。RDF将这些文字定义为全部从stringinheritance。 我们可以使用SPARQLfilter方法isLiteral
过滤掉那些文本属性:
SELECT DISTINCT ?property WHERE { ?sa <http://xmlns.com/foaf/0.1/Person>; ?property ?o . FILTER isLiteral(?o) }
我们在这里只想得到具有字面值的属性 – string,date时间,布尔值或其他XSD数据types之一。
但是非文字对象呢? 考虑这个非常简单的伪Java类定义作为一个类比:
public class Person { int age; Person marriedTo; }
使用上面的查询,如果age属性被绑定,我们将返回代表age的字面值。 但是,marriedTo不是原始的(即RDF术语中的字面意思) – 它是对另一个对象的引用 – 在RDF / OWL术语中,这是一个对象属性。 但是我们不知道这些属性(谓词)正在引用什么types的对象。 这个查询会让你回到属性和伴随的types。
SELECT DISTINCT ?property, ?class WHERE { ?sa <http://xmlns.com/foaf/0.1/Person>; ?property ?o . ? a ?class . FILTER(!isLiteral(?o)) }
这应该足以将您定位在特定的数据集中。 当然,我也build议你只抽出一些个人资源并检查它们。 你可以使用DESCRIBE查询来做到这一点:
DESCRIBE <http://example.org/resource>
有一些SPARQL工具(例如SNORQL)可让您在浏览器中执行此操作。 我已经链接到的SNORQL实例有一个示例查询来探索可能的命名图,我没有在这里介绍。
如果您对SPARQL不熟悉,说实话,如果卡住了,最好的资源是规范。 这是一个W3C规范,但却是一个很好的规范(他们构build了一个体面的testing套件,所以你可以真正看到实现是否正确完成),如果你能克服复杂的语言,这是非常有帮助的。
我发现以下一组探索性查询很有用:
看到类:
select distinct ?type ?label where { ?sa ?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
我经常引用voiD项目中的这个查询列表 。 它们主要是统计性质的,但不仅是。 从一些语句中移除COUNT并不难,以获得实际的值。