探索性的SPARQL查询?

时间:2010-05-28 15:22:48

标签: rdf sparql

每当我开始使用sql时,我倾向于在数据库中抛出几个探索性语句,以便了解什么是可用的,以及数据的形式。

例如

show tables

describe table

select * from table

任何人都可以帮助我理解使用SPARQL端点完成对rdf数据存储的类似探索的方法吗?

谢谢:)

5 个答案:

答案 0 :(得分:77)

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

以下是如何查看正在使用的类:

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

LIMITOFFSET用于分页。特别是如果您通过Internet发送查询,请务必习惯这些。我会在其他示例中省略它们。)< / p>

a是一种特殊的SPARQL(和Notation3 / Turtle)语法来表示rdf:type谓词 - 这会将各个实例链接到owl:Class / {{ 1}}类型(大致相当于SQL RDBMSes中的表)。

其次,您要查看属性。您可以使用您搜索的类或仅查找属性来执行此操作。让我们从商店中获取所有商品:

rdfs:Class

这将获得您可能不感兴趣的所有属性。这相当于SQL中所有行列的列表,但没有按表进行任何分组。

更有用的是查看声明特定类的实例正在使用哪些属性:

SELECT DISTINCT ?property
WHERE {
  ?s ?property ?o .
}

这将使您回到满足第一个三元组的任何实例上使用的属性 - 即具有SELECT DISTINCT ?property WHERE { ?s a <http://xmlns.com/foaf/0.1/Person>; ?property ?o . } rdf:type的实例。

请记住,因为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属性,我们将返回代表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工具 - 例如SNORQL - 允许您在浏览器中执行此操作。我链接到的SNORQL实例有一个示例查询,用于探索可能的命名图,我在这里没有介绍过。

如果您不熟悉SPARQL,说实话,如果遇到问题,最好的资源就是规范。这是一个非常好的W3C规范(它们构建了一个不错的测试套件,因此你可以真正看到实现是否正确完成了它),如果你能克服复杂的语言,它会非常有用。

答案 1 :(得分:7)

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

看到课程:

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 
    } 
}

答案 2 :(得分:2)

SELECT DISTINCT * WHERE {
  ?s ?p ?o
}
LIMIT 10

答案 3 :(得分:1)

我经常提到这个list of queries from the voiD project。它们主要是统计性的,但不仅如此。从某些语句中删除COUNT并不难以获得实际值。

答案 4 :(得分:0)

特别是对于大型数据集,重要的是将模式与噪声区分开来,并了解哪些结构经常使用,哪些很少使用。我使用聚合查询来计算主要类、谓词等,而不是 SELECT DISTINCT。例如,以下是查看数据集中最重要谓词的方法:

SELECT ?pred (COUNT(*) as ?triples)
WHERE {
    ?s ?pred ?o .
}
GROUP BY ?pred
ORDER BY DESC(?triples)
LIMIT 100

我通常首先列出存储库中的及其大小,然后查看感兴趣的图中的(再次使用计数),然后我感兴趣的类的谓词

当然,如果合适,这些选择器可以组合和限制。要查看为 foaf:Person 类型的实例定义了哪些谓词,并按图对其进行分解,您可以使用:

SELECT ?g ?pred (COUNT(*) as ?triples)
WHERE {
    GRAPH ?g {
       ?s a foaf:Person .
       ?s ?pred ?o .
}
GROUP BY ?g ?pred
ORDER BY ?g DESC(?triples)

这将列出每个图中的谓词,按频率降序排列。