每当我开始使用 sql 时,我倾向于在数据库中抛出几个探索性语句,以便了解什么是可用的,以及数据采用何种形式。
例如。
show tables describe table select * from table
任何人都可以帮助我理解使用 SPARQL 端点完成对 rdf 数据存储的类似探索的方法吗?
谢谢:)
嗯,显而易见的第一个开始是查看数据中存在的类和属性。
以下是如何查看正在使用的类:
SELECT DISTINCT ?class WHERE { ?s a ?class . } LIMIT 25 OFFSET 0
(LIMIT和OFFSET用于分页.特别是如果你通过互联网发送你的查询,这是值得习惯的.我会在其他 examples.)省略它们
LIMIT
OFFSET
a是一种特殊的 SPARQL(和Notation3/龟)语法来表示rdf:type谓词 - 它将各个实例链接到owl:Class/rdfs:Class类型(大致相当于 SQL RDBMSes 中的表)。
a
rdf:type
owl:Class
rdfs:Class
其次,你想看看属性。您可以使用您搜索的类或仅查找属性来执行此操作。让我们从商店中获取所有商品:
SELECT DISTINCT ?property WHERE { ?s ?property ?o . }
这将获得您可能不感兴趣的所有属性。这相当于 SQL 中所有行列的列表,但没有按表进行任何分组。
更有用的是查看声明特定类的实例正在使用哪些属性:
SELECT DISTINCT ?property WHERE { ?s a <http://xmlns.com/foaf/0.1/Person>; ?property ?o . }
这将使您回到在满足第一个三元组的任何实例上使用的属性 - 即具有http://xmlns.com/foaf/0.1/Person的http://xmlns.com/foaf/0.1/Person。
http://xmlns.com/foaf/0.1/Person
请记住,因为 rdf:Resource 可以有多个 rdf:type 属性 - 如果你愿意的话 - 并且因为 RDF 的数据模型是附加的,所以你没有钻石问题。这种类型只是另一种属性 - 它只是一个有用的社会协议,说有些东西是人或狗或基因或足球队。这并不意味着数据存储将包含通常与该类型相关联的属性。该类型不保证资源可能具有的属性。
您需要熟悉数据模型以及 SPARQL 的 UNION 和 OPTIONAL 语法的使用。 rdf:type 到 SQL 表的粗略映射就是那么粗糙。
您可能想知道属性指向的实体类型。首先,您可能想知道数据类型属性 - 相当于文字或基元。你知道,字符串,整数等.RDF 将这些文字定义为从字符串继承的所有文字。我们可以使用 SPARQL 过滤器方法isLiteral过滤掉那些属于文字的属性:
isLiteral
SELECT DISTINCT ?property WHERE { ?s a <http://xmlns.com/foaf/0.1/Person>; ?property ?o . FILTER isLiteral(?o) }
我们在这里只获取具有文字的属性 - 字符串,date-time,布尔值或其他 XSD 数据类型之一。
但是 non-literal 对象怎么样?将这个非常简单的 pseudo-Java 类定义视为一个类比:
public class Person { int age; Person marriedTo; }
使用上面的查询,如果绑定了 age 属性,我们将返回表示 age 的文字。但是,结婚不是原始的(i.e.RDF 术语中的文字) - 它是对另一个对象的引用 - 在 RDF/OWL 术语中,这是一个对象属性。但我们不知道那些属性(谓词)引用了哪种对象。此查询将返回带有附带类型的属性(?o值为其成员的类)。
?o
SELECT DISTINCT ?property, ?class WHERE { ?s a <http://xmlns.com/foaf/0.1/Person>; ?property ?o . ?o a ?class . FILTER(!isLiteral(?o)) }
这应该足以让自己定位在特定的数据集中。当然,我还建议您只需提取一些资源并进行检查。您可以使用 DESCRIBE 查询执行此操作:
DESCRIBE <http://example.org/resource>
有一些 SPARQL 工具 - 例如SNORQL - 允许您在浏览器中执行此操作。我链接到的 SNORQL 实例有一个示例查询,用于探索可能的命名图,我在这里没有介绍过。
如果您不熟悉 SPARQL,老实说,如果遇到问题,最好的资源就是规范。它是一个 W3C 规范,但是非常好(它们构建了一个不错的测试套件,因此您可以实际看到实现是否正确完成)并且如果您可以克服复杂的语言,那么它非常有用。
我发现以下一组探索性查询很有用:
看到课程:
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
我经常提到这个来自 voiD 项目的查询列表。它们主要是统计性的,但不仅如此。从某些语句中删除 COUNT 以获取实际值应该不难。
4 回答
嗯,显而易见的第一个开始是查看数据中存在的类和属性。
以下是如何查看正在使用的类:
(
LIMIT
和OFFSET
用于分页.特别是如果你通过互联网发送你的查询,这是值得习惯的.我会在其他 examples.)省略它们a
是一种特殊的 SPARQL(和Notation3/龟)语法来表示rdf:type
谓词 - 它将各个实例链接到owl:Class
/rdfs:Class
类型(大致相当于 SQL RDBMSes 中的表)。其次,你想看看属性。您可以使用您搜索的类或仅查找属性来执行此操作。让我们从商店中获取所有商品:
这将获得您可能不感兴趣的所有属性。这相当于 SQL 中所有行列的列表,但没有按表进行任何分组。
更有用的是查看声明特定类的实例正在使用哪些属性:
这将使您回到在满足第一个三元组的任何实例上使用的属性 - 即具有
http://xmlns.com/foaf/0.1/Person
的http://xmlns.com/foaf/0.1/Person
。请记住,因为 rdf:Resource 可以有多个 rdf:type 属性 - 如果你愿意的话 - 并且因为 RDF 的数据模型是附加的,所以你没有钻石问题。这种类型只是另一种属性 - 它只是一个有用的社会协议,说有些东西是人或狗或基因或足球队。这并不意味着数据存储将包含通常与该类型相关联的属性。该类型不保证资源可能具有的属性。
您需要熟悉数据模型以及 SPARQL 的 UNION 和 OPTIONAL 语法的使用。 rdf:type 到 SQL 表的粗略映射就是那么粗糙。
您可能想知道属性指向的实体类型。首先,您可能想知道数据类型属性 - 相当于文字或基元。你知道,字符串,整数等.RDF 将这些文字定义为从字符串继承的所有文字。我们可以使用 SPARQL 过滤器方法
isLiteral
过滤掉那些属于文字的属性:我们在这里只获取具有文字的属性 - 字符串,date-time,布尔值或其他 XSD 数据类型之一。
但是 non-literal 对象怎么样?将这个非常简单的 pseudo-Java 类定义视为一个类比:
使用上面的查询,如果绑定了 age 属性,我们将返回表示 age 的文字。但是,结婚不是原始的(i.e.RDF 术语中的文字) - 它是对另一个对象的引用 - 在 RDF/OWL 术语中,这是一个对象属性。但我们不知道那些属性(谓词)引用了哪种对象。此查询将返回带有附带类型的属性(
?o
值为其成员的类)。这应该足以让自己定位在特定的数据集中。当然,我还建议您只需提取一些资源并进行检查。您可以使用 DESCRIBE 查询执行此操作:
有一些 SPARQL 工具 - 例如SNORQL - 允许您在浏览器中执行此操作。我链接到的 SNORQL 实例有一个示例查询,用于探索可能的命名图,我在这里没有介绍过。
如果您不熟悉 SPARQL,老实说,如果遇到问题,最好的资源就是规范。它是一个 W3C 规范,但是非常好(它们构建了一个不错的测试套件,因此您可以实际看到实现是否正确完成)并且如果您可以克服复杂的语言,那么它非常有用。
我发现以下一组探索性查询很有用:
看到课程:
看到属性:
查看数据属性:
查看实际使用的属性:
查看断言的实体:
查看使用中的不同图表:
我经常提到这个来自 voiD 项目的查询列表。它们主要是统计性的,但不仅如此。从某些语句中删除 COUNT 以获取实际值应该不难。