网上冲浪我遇到Aquabrowser(无需点击,我会发布相关部分的照片)。
它有一种很好的方式来呈现搜索结果和发现语义链接的实体。
在左侧,您可以输入您输入的字词和相关字词。 点击它们可以改善结果。
现在作为一个示例项目,我有一个电影实体和主题的数据集(如wolrd-war-2或者监狱逃脱)及其关系。
现在我想象几个用例,首先是用户以关键字开头的用例。 例如“第二次世界大战”。
然后我会以某种方式计算相关的关键词并对它们进行排名。
我想一些像这样的SQL查询:
让我们假设“第二次世界大战”有身份3。
select keywordId, count(keywordId) as total from keywordRelations
WHERE movieId IN (select movieId from keywordRelations
join movies using (movieId)
where keywordId=3)
group by keywordId order by total desc
基本上应该选择所有也有关键字world-war-2的电影,然后查找theese电影所拥有的关键词,并选择那些最容易出现的关键词。
我认为使用theese关键字,我可以选择最匹配的电影,并拥有包含类似电影和相关关键字的漂亮标签云。
我认为这应该有效,但非常非常非常低效。
它也只有一个级别或关系。
必须有更好的方法来做到这一点,但是如何?
我基本上有一组实体。它们可以是不同的实体(电影,演员,主题,情节关键词)等。
我也有他们之间的关系。
必须以某种方式有效地计算实体的“语义距离”。
我也希望实现更多层次的关系。
但我完全陷入困境。好吧,我尝试了不同的方法,但一切都以一些算法结束,需要花费很长时间才能计算出来,并且运行时间呈指数级增长。
是否有针对此优化的数据库系统?
有人能指出我正确的方向吗?
答案 0 :(得分:5)
您可能需要RDF triplestore。 Redland是一个非常常用的,但它实际上取决于您的需求。查询在SPARQL中完成,而不是SQL。另外......你必须喝语义网络koolaid。
答案 1 :(得分:1)
从你的标签我看到你对sql更熟悉,我认为它仍然可以有效地用于你的任务。
我有一个应用程序,其中使用sqlite作为数据库实现定制的全文搜索。在搜索字段中,我可以输入术语,弹出列表将显示关于该单词的建议,对于任何下一个单词,仅显示出现在先前输入的单词出现的文章中的那些单词。所以它类似于你描述的任务
为了使事情更简单,我们假设我们只有三个表。我想你有一个不同的架构甚至细节可能不同,但我的解释只是给出一个想法。
词 [Id,Word]该表包含单词(关键字)
索引 [Id,WordId,ArticleId] 此表(也由WordId索引)列出了该术语出现的文章
ArticleRanges [ArticleId,IndexIdFrom,IndexIdTo] 此表列出了任何给定文章的Index.Id范围(显然也由ArticleId索引)。此表要求对于任何新的或更新的文章,索引表应包含具有已知from-to范围的条目。我认为可以通过任何RDBMS实现自动增量功能的一点帮助
因此,对于任何给定的单词串
虽然我将它们列为单独的操作,但最终的查询可能只是基于解析的查询字符串的大sql。