语义查询和普通查询有什么区别?


回答 1:

语义查询/普通查询有点用词不当。但我希望解释一下我回答的不同之处。基本的答案是这样,“正常”查询是人类无法理解的,“语义”查询是人类无法理解的。打个比方:在汽车中,带有两个踏板的自动变速箱是具有手动变速箱和三个踏板的手动变速箱的语义级别。

我的学习方式是这样-特别是在调优数据库方面。数据库引擎将信息存储在磁盘上以供以后检索的所有操作均根据某种计划进行。在数据库软件的某个级别上,存在一组算法,这些算法决定将哪些内容写入磁盘以及哪些内容保留在内存中。这通常称为“刷新”到磁盘,并且在大多数数据库系统中取决于虚拟内存模型。根据您要处理的数据类型,可以调整这些缓存的大小和刷新频率。

例如,您可能在网页上缓存了有关客户注册和验证的信息。因此,您可能希望将其缓存在数据库RAM中,因为您希望该网站立即需要相同的数据供新客户验证输入的信息。另一方面,您可能正在输入有关库存中新项目的库存信息。不会很快得到验证,因此您可能会使用小型缓存并将其立即刷新到磁盘上。那只是为了加载。

现在,在您的网站与数据库进行对话的API(或与数据库进行对话的任何应用程序)的API级别,您可以仅在API调用或配置文件中指定缓存大小和刷新频率。您可以用Java编写该代码,也可以为会话传递一些参数。所有这一切都是“正常的”,您可以为任何数据库系统的API做到这一点。

另一方面,“语义”查询在更高的抽象级别上封装了这些细节。因此,我可能会设计一个语义层,并决定调用一个缓存和刷新设置“ FAST”,另一个调用“ SLOW”。现在,我需要知道的是我是否正在执行“ FAST”或“ SLOW”查询。

-

现在,与我想更多的人在专业上提出的问题相关的问题可能与MongoDB之类的事情有关,MongoDB是一个“ NoSQL”数据库,可以通过问题后带有八个参数的一些棘手的POST或GET响应来自URI的REST API调用标记。您的Javascript会进行各种体操操作,以将该表格的输入转换为该精美的URI。那将是一个“普通”查询,看起来与SQL完全不同。所有这些都是因为人们希望为Javascript建立REST API,而不是为了建立通用语义层,该语义层将所有可能的“正常”查询转换为标准查询语言(例如SQL)。

同样,所有这些都存在于Hadoop周围的多个分散的开发人员中,他们编写了诸如Hive和Pig的查询实用程序,这些实用程序在对HFS的Java API调用之上添加了抽象的语义层。同样,数据库系统中所有不同的较小部分都由多个作者组成,而不是全部打包在一起。

关键是多年来,许多开发人员一直在使用Apache和Apache插件在通用的REST API世界中工作,以在不充实语义层的情况下使用开放源代码并生成该系统。这是因为,如果您可以雇用某个具有使Javascript进行底层数据库调用的技能的人员,则不需要。但是现在,Node.js和Rails之类的东西已经标准化了Web开发人员从数据库中需要的一些东西,对于那些不想编写较低级别的调用的人来说,这只是另一个语义层抽象功能。

“我要做的就是建立一个带有评论的网站,我不想了解数据库”。好了,有人为您建立了一个语义层,现在您可以将其称为“正常”查询。但是其他人可能会在该语义层之上构建一个语义层,以使其在进入Web开发中时甚至更低的进入障碍变得更加容易。

因此,最终“正常”和“语义”之间没有区别,这的确是有人完成了构建语义语义级别的工作,您需要使系统正常工作。当然,您可以从抽象层中获得多少特异性和性能。