抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

怎样让计算机理解每个文本的语义?怎样让信息检索更高效?Web 3.0 时代距离我们有多遥远?

问题引入

现有餐馆信息表如下:

ID Name Address Cuisine Fruits
1 老北京饭店 北京王府井大街 北京菜 YES
2 沂蒙炒鸡 临沂北京路 鲁菜 YES
3 麻婆豆腐 成都万福桥边 川菜 NO

看起来很规范,但现在我又有了一组新数据:酒吧信息表

ID Name Address Drink DJ
1 The Bitter End U.S.A Whisky YES
2 小酒馆的门口 成都玉林路 孟婆汤 NO

对于之前的结构,我们不再与新数据合并,为了接口统一,将两个表连接起来,关系数据库中的思想就是新建 场所表

PlaceID RestaurantID BarID
1 1 Null
2 2 Null
3 3 Null
4 Null 1
5 Null 2

image-20211107071611064

这时我们就可以解决一些简单的需求了——

  • 查询 提供孟婆汤的场所
SELECT * FROM restaurant, bar, place
WHERE restaurant.ID = place.ID
	AND bar.ID = place.ID
	AND Drink = '孟婆汤'
  • 查询 北京的所有场所
SELECT * FROM restaurant, bar, place
WHERE restaurant.ID = place.ID
	AND bar.ID = place.ID
	AND Address like '北京%'
  • 查询 所有提供水果的场所
SELECT * restaurant, bar, place
WHERE restaurant.ID = place.ID
	AND bar.ID = place.ID
	AND Fruits = 'YES'

还不错,对吧?

你可能已经习惯了这些,但第二个和第三个需求的实现,有很多冗余操作

第二个实现,想查询所有在北京的场所,就必须将两个表连接,才能拿到所有地址。

解决办法就是在场所表中添加 address 字段,这样每次就不用连接,查到 id 直接去拿信息。

第三个实现,查询提供水果的场所,因为只有餐馆才可能提供水果,酒吧完全可以忽略掉。

解决了吗?

没有,反而越来越乱,哪一天公司扩大势力范围,再新增了早餐店表,难道又要对之前的结构做一次抽象?

关系型数据库添加新字段极其繁琐,随着项目越来越大,数据的管理问题将变得难以解决,甚至完全无法解决。

怎么办?

通常,想要把一件事说明白,并且说的清楚,最高效的方式就是采用 主-谓-宾 结构,即 主语 + 谓语 + 宾语。

如:

  • 小明喜欢蘑菇
  • 蘑菇吓到小红

上面的每一句话都代表一条信息,“小明”和“小红”是指特定的人,“蘑菇”是指一类有机菌类,而“喜欢”和“吓到”告诉你人和有机菌类之间的关系。现在,使用从这两个句子中得出的含义,你就能回答一些简单的问题,例如 ”谁喜欢蘑菇?“

既然如此,是否可以定义一个模式,它足够灵活,能处理各种不断变化的类型,同时仍然保持一定的可读性?

也许可以将模式设计为对新场所目的概念开发,并为他们提供自定义字段,如图所示,该模式完全去掉了酒吧和餐馆的概念,现在只包含场所列表和对应的自定义属性。

image-20211107072018418

Properties表

PlaceID Field Value
1 Name 老北京饭店
1 Address 北京王府井大街
1 Cuisine 北京菜
1 Fruits YES
2 Name 沂蒙炒鸡
2 Address 临沂北京路

有没有发现,表中的每一条记录正好对应 主-谓-宾 结构

Place1 - Name - 老北京饭店

Place1 - Address - 王府井大街

看!每个数据都与定义它的属性一起描述。在此过程中,我们使用了先前从表和列中推断出来的语义关系,并使它们成为表中的数据。这就是语义数据建模的本质:

灵活的模式,数据自身描述模式关系

不仅仅如此,对场所数据进行参数化使得模型非常灵活。当我们了解到场所的新特性(增加新的字段)时,只需要在表格里添加一行。对场所数据进行参数化的处理也非常简单,要利用数据,几乎不需要了解数据的组织,一旦知道共享相同的 PlaceID 的行彼此相关,就可以选择相同的 PlaceID 的所有行来了解该场所的所有知识,这极大地方便了数据的检索。

总结

对于 主-谓-宾 这种结构,有个统一的叫法:三元组

这种结构适用于信息检索,下篇文章继续聊。

评论