Rdf 探索性SPARQL查询?

Rdf 探索性SPARQL查询?,rdf,sparql,Rdf,Sparql,每当我开始使用sql时,我倾向于在数据库中抛出几个探索性语句,以便了解什么是可用的,以及数据采用什么形式 例如 有人能帮我理解使用SPARQL端点完成rdf数据存储的类似探索的方法吗 谢谢:)显然,第一步是查看数据中的类和属性 下面是如何查看正在使用的类: SELECT DISTINCT ?class WHERE { ?s a ?class . } LIMIT 25 OFFSET 0 (LIMIT和OFFSET用于分页。特别是当您通过Internet发送查询时,使用它们是值得的。在其他示例

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

例如

有人能帮我理解使用SPARQL端点完成rdf数据存储的类似探索的方法吗


谢谢:)

显然,第一步是查看数据中的类和属性

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

SELECT DISTINCT ?class
WHERE {
  ?s a ?class .
}
LIMIT 25
OFFSET 0
LIMIT
OFFSET
用于分页。特别是当您通过Internet发送查询时,使用它们是值得的。在其他示例中,我将省略它们。)

a
是一种特殊的SPARQL(and/)语法,用于表示
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 .
}
在这里,我们只获取对象为文本的属性—字符串、日期时间、布尔值或其他XSD数据类型之一

但是非文字对象呢?把这个非常简单的伪java类定义看作是一个类比:

public class Person {
    int age;
    Person marriedTo;
}
使用上面的查询,如果age属性被绑定,我们将返回表示age的文本。但是marriedTo不是一个原语(即RDF术语中的文字)——它是对另一个对象的引用——在RDF/OWL术语中,这是一个对象属性。但是我们不知道这些属性(谓词)引用的是什么类型的对象。此查询将返回带有附带类型的属性(其中
?o
值是其成员的类)

选择不同的属性,?类
在哪里{
?s a;
财产。
o a级。
过滤器(!isLiteral(?o))
}
这应该足以使您在特定的数据集中定位。当然,我还建议您拿出一些单独的资源并检查它们。您可以使用“描述”查询执行此操作:

DESCRIBE <http://example.org/resource>
描述
例如,有一些SPARQL工具允许您在浏览器中执行此操作。我链接到的SNORQL实例有一个示例查询,用于探索可能的命名图,我在这里没有介绍


如果您不熟悉SPARQL,老实说,如果您陷入困境,最好的资源就是规范。这是一个W3C规范,但非常好(他们构建了一个相当不错的测试套件,这样您就可以真正看到实现是否正确地完成了它),如果您能够克服复杂的语言,它将非常有用。

好吧,显而易见的第一步是查看数据中存在的类和属性

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

SELECT DISTINCT ?class
WHERE {
  ?s a ?class .
}
LIMIT 25
OFFSET 0
LIMIT
OFFSET
用于分页。特别是当您通过Internet发送查询时,使用它们是值得的。在其他示例中,我将省略它们。)

a
是一种特殊的SPARQL(and/)语法,用于表示
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 .
}
在这里,我们只获取对象为文本的属性—字符串、日期时间、布尔值或其他XSD数据类型之一

但是非文字对象呢?把这个非常简单的伪java类定义看作是一个类比:

public class Person {
    int age;
    Person marriedTo;
}
使用上面的查询,如果age属性被绑定,我们将返回表示age的文本。但是marriedTo不是一个原语(即RDF术语中的文字)——它是对另一个对象的引用——在RDF/OWL术语中,这是一个对象属性。但是我们不知道这些属性(谓词)引用的是什么类型的对象。此查询将返回带有附带类型的属性(其中
?o
值是其成员的类)

选择不同的属性,?类
在哪里{
?s a;
财产。
o a级。
过滤器(!isLiteral(?o))
}
这应该足以使您在特定的数据集中定位。当然,我还建议您拿出一些单独的资源并检查它们。您可以使用“描述”查询执行此操作:

DESCRIBE <http://example.org/resource>
描述
例如,有一些SPARQL工具允许您在浏览器中执行此操作。我链接到的SNORQL实例有一个示例查询,用于探索可能的命名图,我在这里没有介绍

如果您不熟悉SPARQL,老实说,如果您陷入困境,最好的资源就是规范。这是一个W3C规范,但非常好(他们构建了一个相当不错的测试套件,这样您就可以真正看到实现是否正确地完成了它),如果您能够克服复杂的语言,它将非常有用。

我经常提到这一点。它们主要是统计性质的,但不仅仅是统计性质的。从som中删除计数应该不难
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 ?pred (COUNT(*) as ?triples)
WHERE {
    ?s ?pred ?o .
}
GROUP BY ?pred
ORDER BY DESC(?triples)
LIMIT 100
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)