我很乐意使用SQL
,但却无法理解SPARQL
。对于初学者,我甚至不了解如何查看数据的结构(在MySQL
我会做describe <table name>
),因此我可以查询相应的字段。
我有办法将整个RDF数据集导入MySQL数据库中的相应表吗?
除此之外,是否有一种方法可以从所有表中SELECT *
(或者等效的描述符),这样我就可以将所有输出数据输入csv(并获取它)从那里?)
我尝试查询的RDF数据集有一个SPARQL endpoint甚至是How to SPARQL的指南,但我很难理解它。
例如:
PREFIX meannot: <http://rdf.myexperiment.org/ontologies/annotations/>
PREFIX sioc: <http://rdfs.org/sioc/ns#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX mebase: <http://rdf.myexperiment.org/ontologies/base/>
SELECT DISTINCT ?annotator_name
WHERE {
?comment mebase:annotates <http://www.myexperiment.org/workflows/52> .
?comment rdf:type meannot:Comment .
?comment mebase:has-annotator ?annotator
?annotator sioc:name ?annotator_name
}
对我来说没什么意义。为什么在某些WHERE语句结束时有一段时间而在其他语句中没有? ?comment mebase:has-annotator ?annotator
用简单的英语表示什么?选择注释器名称作为注释器名称的注释器名称?啊?
我很感激您可以指出的任何资源。
答案 0 :(得分:18)
虽然SPARQL在语法中看起来像它的功能实际上是完全不同的,这是你和许多其他人在尝试学习时遇到的问题。
SPARQL是关于三重模式匹配而不是从SQL这样的表中进行选择。示例中的每组三个项目代表三重模式。例如:
?comment rdf:type meannot:Comment .
这告诉SPARQL处理器找到rdf:type
meannot:Comment
?comment
的任何内容,即类型为comment 的内容。在这种模式中,?comment mebase:annotates <http://www.myexperiment.org/workflows/52> .
?comment rdf:type meannot:Comment .
是一个充当通配符的变量,可以将其视为SQL中可以选择的字段
如果我们添加使用变量的其他三重模式,那么我们要求SPARQL处理器找到所有匹配所有三重模式的东西,所以:
SELECT commentID FROM COMMENTS WHERE itemID=1234
这会找到对特定项目发表评论的内容
在SQL术语中,这就像编写?comment mebase:annotates <http://www.myexperiment.org/workflows/52> .
?comment rdf:type meannot:Comment .
?comment mebase:has-annotator ?annotator .
一样,如果这有助于您理解它。
当我们开始添加其他变量时,您可以将其视为与其他表的连接:
SELECT commentID, userID FROM COMMENTS C INNER JOIN USERS U ON C.userID=U.userID WHERE itemID=1234
这会找到评论的内容以及在特定项目上生成这些内容的用户
它大致相当于SQL中的.
就语法而言,;
表示三重模式的结束
在您的示例中省略它的事实实际上是人们发布如何引导的错误。我碰巧在一个参与该项目的大学工作,所以我给同事留了一张纸条,要求他们解决这个问题。
您在示例中还可以看到在三重模式结束时使用?comment mebase:annotates <http://www.myexperiment.org/workflows/52> ;
rdf:type meannot:Comment .
。这些是重复主题的缩写,例如
?comment
意味着您不必再为后续模式键入,
。
类似地?comment rdf:type meannot:Comment , ex:Annotation .
用于重复主语和谓词:
?comment
意味着重复rdf:type
和SELECT * WHERE { ?s ?p ?o }
,用简单的英语,上面的类型为注释和类型注释的内容
RDF不存储在表中,因为它是无模式数据模型,与表最接近的是命名图,这只是将三元组逻辑分组在一起的一种方法。
在exploratory SPARQL queries上查看此问题,了解有关查询的一些建议。
如果你只想选择你可以做的所有事情LIMIT
- 请注意许多端点会对一个查询的结果数量施加限制,所以即使端点后面有三百万个三元组,你也可能只得到它几千回。您可以使用OFFSET
和SELECT * WHERE { ?s ?p ?o } LIMIT 1000 OFFSET 0
SELECT * WHERE { ?s ?p ?o } LIMIT 1000 OFFSET 1000
SELECT * WHERE { ?s ?p ?o } LIMIT 1000 OFFSET 2000
# And so forth until you find no further results
例如
{{1}}
如果您只是想通过浏览网站上的所有数据来查看它们是否提供 RDF转储,它通常是带有一堆RDF文件的压缩存档它。这将让您在本地查看数据
有些系统可以让您将RDF存储在基于SQL的数据库中,但是可以从使用各种三重存储的人那里获取它,这与使用原生三重存储的性能相差无几。
您可能对R2RML感兴趣,这是一个新的W3C标准(目前处于早期工作草案中),它定义了将关系数据映射到RDF的标准方法。他们的一些文档可能有助于您更好地理解RDF / SPARQL和SQL之间的关系
有关更全面的教程,我会查看SPARQL by Example,这是SPARQL规范的作者之一,强烈推荐
答案 1 :(得分:3)