如何有效地构建和存储语义图?

时间:2011-01-19 23:08:49

标签: sql mysql database algorithm semantics

网上冲浪我遇到Aquabrowser(无需点击,我会发布相关部分的照片)。

它有一种很好的方式来呈现搜索结果和发现语义链接的实体。

以下是onedemos截图。

在左侧,您可以输入您输入的字词和相关字词。 点击它们可以改善结果。

aqua

现在作为一个示例项目,我有一个电影实体和主题的数据集(如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关键字,我可以选择最匹配的电影,并拥有包含类似电影和相关关键字的漂亮标签云。

我认为这应该有效,但非常非常非常低效。

它也只有一个级别或关系。

必须有更好的方法来做到这一点,但是如何?

我基本上有一组实体。它们可以是不同的实体(电影,演员,主题,情节关键词)等。

我也有他们之间的关系。

必须以某种方式有效地计算实体的“语义距离”。

我也希望实现更多层次的关系。

但我完全陷入困境。好吧,我尝试了不同的方法,但一切都以一些算法结束,需要花费很长时间才能计算出来,并且运行时间呈指数级增长。

是否有针对此优化的数据库系统?

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:5)

您可能需要RDF triplestoreRedland是一个非常常用的,但它实际上取决于您的需求。查询在SPARQL中完成,而不是SQL。另外......你必须喝语义网络koolaid。

答案 1 :(得分:1)

从你的标签我看到你对sql更熟悉,我认为它仍然可以有效地用于你的任务。

我有一个应用程序,其中使用sqlite作为数据库实现定制的全文搜索。在搜索字段中,我可以输入术语,弹出列表将显示关于该单词的建议,对于任何下一个单词,仅显示出现在先前输入的单词出现的文章中的那些单词。所以它类似于你描述的任务

为了使事情更简单,我们假设我们只有三个表。我想你有一个不同的架构甚至细节可能不同,但我的解释只是给出一个想法。

  • 词 [Id,Word]该表包含单词(关键字)

  • 索引 [Id,WordId,ArticleId] 此表(也由WordId索引)列出了该术语出现的文章

  • ArticleRanges [ArticleId,IndexIdFrom,IndexIdTo] 此表列出了任何给定文章的Index.Id范围(显然也由ArticleId索引)。此表要求对于任何新的或更新的文章,索引表应包含具有已知from-to范围的条目。我认为可以通过任何RDBMS实现自动增量功能的一点帮助

因此,对于任何给定的单词串

  • 将所有先前单词出现的所有文章相交。这将缩小搜索范围。 SELECT ArticleId FROM Index其中WordId = ... INTERSECT ...
  • 对于文章列表,您可以从ArticleRanges表中获取记录范围
  • 对于此范围,您可以从Index中对WordId列表进行有效查询,将结果分组以获取Count,最后按其排序。

虽然我将它们列为单独的操作,但最终的查询可能只是基于解析的查询字符串的大sql。