我们知道,三元组数据库用来存储相同的数据结构(三元组:主谓宾),使用SPARQL语句可以在不同的数据库之间通用,即同样的SPARQL语句可以在不同的系统之间进行检索。这就引出了SPARQL中的最亮的一个功能:联邦查询(Federated Query)。联邦查询可以使SPARQL跨数据集进行检索,而无需将这些数据集的数据存放到同一个数据库。
一、“并行”查询远程数据集数据
我们尝试在自己的Virtuoso里面检索CBDB(中国历代人物传记资料库)数据,这里用到SERVICE功能。我们来看一个例子:
使用SPARQL进行检索时,一定要注意使用效率。三元组对于主语和宾语有一个已经确认的情况下,性能较高;尽量避免字符串的操作,比如字符串的截取,字符串的对比等。
SERVICE在一个SPARQL中可以含有多个,即从多个数据集中获取数据。我们一起看下面的SPARQL:
从中可以看出,蓝色的资源s来自于CBDB(资源地址为http://cbdb.library.sh.cn/entity/person/246cgp1bxccnra16);红色的资源s来自于SionPedia(资源地址为http://sinopedia.library.sh.cn/entity/person/7e74fe7977504f2d83624aebea984615)。
二、“串行”查询远程数据集数据
W3C的关联数据标准要求尽可能关联多的数据集(注:以后我们可以专门讲解关联数据的相关知识),不同数据集之间的资源可以用owl:sameAs、rdfs:seeAlso等属性进行关联,这就给不同数据集之间的数据融合提供了便利。
我们还是看上面的例子(从CBDB和SinoPedia中获取数据),从SinoPedia中可以看出,该资源链接到了CBDB数据库。
因此可以这样来写SPARQL,将CBDB中的数据叠加到SinoPedia数据集中。
我们看两个SERVICE的位置,CBDB的SERVICE嵌套在SinoPedia的SERVICE里面,表示先在SinoPedia数据集中检索李清照信息,再根据owl:sameAs的关联属性,从关联的数据集中获取数据(将?same传入CBDB数据端点)。
此外,这里和之前例子还有一个区别为:之前例子,将两个数据集的资源分别显示,即s中有CBDB的资源,也有SinoPedia的资源;这里则将CBDB的资源属性叠加到SinoPedia资源中,返回的结果只有一个资源URI。
当然,“串行”这种方式,也可以将结果返回为各自的资源URI,和“并行”结果完全一致,您会写吗?大家可以把这个作为今天的作业。
如果把整个SPARQL看成是一个星空,则联邦查询可以看成是星空中最亮的那颗星。在实际应用中,联邦查询也用的非常广,尤其是跨数据集的信息整合(混搭),比如生物医学领域中药物的发现(Drug Discovery),就涉及到疾病、基因、蛋白、药物等多个数据集。这里给个例子,大家可以去自行研究,以后有机会,我们可以一起来学习。
Integrating Wikidata and other linked data sources – Federated SPARQL queries
http://sulab.org/2017/07/integrating-wikidata-and-other-linked-data-sources-federated-sparql-queries/
至此,联邦检索分享结束,要想学好SPARQL,一定要多尝试。下一讲,我们将开始学习SPARQL的其它三种查询模式(ASK、DESCRIBE和CONSTRUCT)。
更多请关注“关联数据”公众号
领取专属 10元无门槛券
私享最新 技术干货