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