SPARQL查询例子解析(一)
匹配查询:查询下列RDF图数据中既包含名字也包含邮箱的人
/*************************************************************************************************************************/
具有数据类型限制的查询
DATA
其中"cat"是RDF数据内容,@en是该内容的一个类型标记;
同理下面的整形 和specialDatatype为一个带有数据类型http://example.org/datatype#specialDatatype的类型化文字。
在具有数据标记的RDF数据中如果不带类型查询是查询不到的例如:
正确的查询方法为:
/*********************************************************************************************************************/
空白节点标签的结果查询。
查询结果可以包含空白节点,本文档中示例结果集中的空白节点“_:”形式编写,后跟空白节点标签
/*********************************************************************************************************************/
查询语句的返回结果可以使用表达式来将结果拼接,现我们将一个人的名字由查询的姓和名拼接而成。
/****************************************************************************************************************/
通过用正则化的方式来匹配查询某一结果
其中FILTER regex内的为正则表达式
/**************************************************************************************************************************/
通过FILTER来做算术运算的限制操作
通过约束变量,只有第二本数与之匹配。达到过滤的要求,其实FILTER可以放在?title . 的下面
/*************************************************************************************************************************/
如果SPARQL中三元组查询模式共享一个宾语,那么可以用 逗号“,”来进行表示
等同于
如果查询三元组里共享一个主语那么,可以用分号来表示“;”
等同于
/***********************************************************************************************************************/
在SPARQL查询字符串中,组图模式使用大括号进行分隔:{}。 例如,此查询的查询模式是一个基本图形模式的组图模式。
从将三重模式分组为两个基本图形模式的查询中可以获得相同的解决方案。 例如,下面的查询具有不同的结构,但会产生与上一个查询相同的解决方案:
/***********************************************************************************************************************/
OPTIONAL为考虑的限制关系,用于加入一个即使没有绑定任何关系,也不会过滤掉该元素。有点类似关系里的或
即使OPTIONAL中限制得由mbox的值的元素,在Bob中没有mbox,那么也会输出该数据
/************************************************************************************************************************/
再举个更深刻的关于OPTIONAL的例子
由查询结果我们可以发现,通过option对price的值进行限制,如果不满足那么在该列输出空内容,但保留内容为空的该元素的其他内容。
/**************************************************************************************************************************/
下面的例子将阐述有两个OPTION内容这样会输出多个可选模型的查询内容
/**************************************************************************************************************************/
SPARQL上采用UNION关键字来实现多种图形模式的组合 如果只输出一列的化,它会将两个模式串联排列起来如图
当将查询结果两列显示的话则会正常显示
/*********************************************************************************************************************/
在SPARQL中FILTER过滤器中采用(NOT EXISTS和EXISTS)来实现全面的过滤效果
NOT EXISTS 表示筛选出查找得目标与数据集不匹配的项,并且给出查询的数据值
例如:
这里就输出匹配不上的项,bob在RDF图中没有相关name数据
相反EXISTS就会输出 匹配到的项
这时EXISTS就会找出匹配到的项
/************************************************************************************************************************/
SPARQL中另一种否定过滤筛选是另一种否定类型“MINUS”关键字,它对两个参数进行评估,删选出不满足与目标相匹配相的结果。
例:
由查询结果可以看出,我们删选出不是BOB名的目标,distinct的目的是使重复的两个数据也只输出一个数据。
/**************************************************************************************************************************/
关于MINUS和NOT EXISTS的区别
MINUS不会在自己语句中去与外界变量进行匹配。
但NOT EXISTS会自行将语句中的变量与语句外的变量进行匹配操作。
例如对于一个DATA集里的空标识数据
在查询语句中NOT EXISTS会将?x与?s进行匹配,这样查询的逻辑为查询其不存在的东西,逻辑上是矛盾的,所以查询结果为空:
而MINUS则不会进行匹配,所以MINUS内的变量不指代数据集中的变量,所以MINUS内的变量存不存在对查询结果无影响
/************************************************************************************************************************/
另外在MINUS与NOT EXISTS,关于这个变量的作用域的还有个明显的区别。我们通过以下这个例子来看
以上是我们例子中的数据集,由两个主语a和b
现在我们用NOT EXISTS来进行过滤
查询结果很明显的现实,NOT EXISTS中?n作用域明显与FILETER上一行的?n对应,所以能正确过滤出q与p值不一样的数据
而在MINUS里面其?n并未绑定,在这里面MINUS与MINUS上一行的?n并不一样,所以在此MINUS里 ?m是与一个随机的数进行的匹配。
所以最后过滤的思路是,输出与?n不相同的主语;而由于?n是随机的,所以a 和b都不与之相等。
/**************************************************************************************************************************/
在SPARQL里提供了循环查询方式 通过 “/”来实现的循环操作
等同于
再换成我们看的懂的查询语句就是
我们来举个例子说明一下这个循环查询
原始数据为
我们用/来实现的循环查询操作
这样的查询语句类似于
现查询主语的标签,再根据标签去查询对应的价格最后输出。
这样的循环操作 有这样一个例子可以来展示其循环效果,就是查询到有标签和价格同时存在的价格之和
/**************************************************************************************************************************/
SPARQL里的BIND的使用方法。
用BIND,可以将查询语句内的变量在BIND中进行数学运算并将运算的结果分配给变量,但是这样新引入的变量不能重新作为查询变量来用,不过可以作为限制条件来采用
该语句的目的即为通过BIND方式来实现利润运算,通过收入减去支持百分百得到的利润price
/**************************************************************************************************************************/
数据可以直接写入到图查询中,或者用我们现在要提到的VAlUES关键字来添加到我们查询语句中。