探索性SPARQL查询?

问题描述 投票:47回答:4

[每当我开始使用sql时,我都会在数据库上抛出一些探索性语句,以便了解可用的内容以及数据采用的格式。

例如

show tables

describe table

select * from table

有人可以帮助我了解使用SPARQL端点完成对rdf数据存储的类似探索的方式吗?

谢谢:)

rdf sparql
4个回答
83
投票

嗯,明显的第一个开始是查看数据中存在的类和属性。

这里是如何查看正在使用的类:

SELECT DISTINCT ?class
WHERE {
  ?s a ?class .
}
LIMIT 25
OFFSET 0

([LIMITOFFSET在那儿进行分页。值得习惯这些,尤其是当您通过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:typehttp://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以获取实际值应该不难。


7
投票

我发现以下一组探索性查询很有用:


3
投票
select distinct ?g where { 
    graph ?g { 
        ?s ?p ?o 
    } 
}

1
投票

我经常引用此SELECT DISTINCT * WHERE { ?s ?p ?o } LIMIT 10 。它们主要具有统计性​​质,但不仅限于此。从某些语句中删除COUNT以获取实际值应该不难。

© www.soinside.com 2019 - 2024. All rights reserved.