第 7 章 查询效率和调试查询效率和调试
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
查询需要一组信息。有时,查询会以不同的方式请求同一组信息,而有些方式比其他方式更有效。记住查询的每个部分要求 SPARQL 处理器执行的工作量(或者用计算机科学术语来说,每个部分在处理器周期上的 "代价"),有助于创建运行速度更快的查询。调试技术和工具还能帮助你调整查询,并修复不尽如人意的查询。
在本章中,我们将学习以下内容:
WHERE 子句是任何查询的核心,其组件的排序和调用函数的选择可以加快或减慢查询速度。
- WHERE 子句之外的效率
一旦 WHERE 子句从数据集返回了值,查询就可以对这些查询进行多种操作,其中有些操作的代价要比其他操作高。
- 调试
SPARQL 查询的调试从任何开发语言都会用到的经典技术开始,也可以利用专业工具的功能。
WHERE 子句内部的效率
在 SPARQL 处理器对查询或更新请求中描述的数据进行列表、排序、删除或插入之前,它通常必须首先将查询 WHERE 子句中的三元组模式与查询数据集中的三元组进行匹配,从而找到您感兴趣的数据。虽然图模式的三重模式的顺序不会影响最终的查询结果,但顺序会对查询的执行速度产生很大影响。关于为什么排序很重要,让我们来看看 SPARQL 处理器在处理 WHERE 子句的三重模式时的简化概述:
它在数据集中查找与第一个三元组模式匹配的三元组。如果一个都没找到,它就会放弃搜索--除非三重模式是在可选子句中,在这种情况下,处理器会继续尝试匹配更多的三重模式。
如果处理器确实找到了至少一个与步骤 1 中的三重模式匹配的三重,并且三重模式中有任何变量,那么处理器就会在这些变量中存储适当的值(或者用专业术语来说,将 它们绑定到这些变量中)。BIND 语句也会为变量赋值。
如果 WHERE 子句中的下一个三元组模式使用了在与前面的三元组模式匹配时绑定的任何变量,查询处理器就会将这些值替换到三元组模式的这些部分,然后去寻找与该模式匹配的三元组。
如果找不到,而三重模式又不在可选子句中,查询处理器就会放弃。如果找到了,它就会继续在步骤 2 中使用该三重模式。
如果查询从未因缺乏匹配而放弃,它会重复第二和第三个步骤,直到 WHERE 子句的全部图模式与数据集匹配为止。然后,它会应用任何 FILTER 语句,这些语句可以使用简单或复杂的表达式来指定要从结果集中过滤掉的三元组。最后,它会将剩余的变量值传递给 WHERE 子句之外的其他查询。
在牢记这些步骤的同时,请记住以下一般原则:快速查询就是,如果没有匹配的图模式,就迅速放弃;如果有匹配的图模式,就迅速返回有界说的变量值。让我们来看看鼓励这样做的一些方法。
缩小搜索空间
想象一下,你在一栋每层有 10 个房间的两层楼房子里丢了太阳镜。就在你开始翻找这 20 个房间之前,从楼上下来的朋友告诉你,她刚刚在楼上的每个房间都找了钥匙,但肯定没有在上面看到你的太阳镜。她缩小了你的搜索空间 ,排除了一半你可能会搜索太阳镜的地方,让你的工作变得更轻松。
无论您是在关系数据库中搜索零件供应商名称,还是在 Google 上搜索您在收音机中听到的歌曲名称,许多加快搜索速度的工程技术都是围绕尽早尽可能缩小搜索空间而设计的。同样的想法也适用于 SPARQL 引擎对三元组集合的搜索。
在我们讨论高效 SPARQL 查询的整个过程中,我们都会看到这个主题。我们将从这一思想的简单应用开始:利用数据类型的优势。RDF 并不要求你声明类,然后确定哪些资源是哪些类的成员,但这样做的三元组更容易快速搜索。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access