1

为了获得一些经验,我正在尝试制作一个可以回答有关动物王国的问题的专家系统。但是,我遇到了对域进行建模的问题。我最初认为动物王国层次结构是这样绘制的

-animal
  -bird
    -carnivore
     -hawk
    -herbivore
     -bluejay
  -mammals
   -carnivores
   -herbivores

我认为这可以让我轻松地进行查询,例如“给我所有的鸟”,但说“给我所有的食肉动物”会贵得多,所以我将层次结构改写为:

-animal
  -carnivore
    -birds
     -hawk
    -mammals
     -xyz
  -herbivores
   -birds
     -bluejay
   -mammals

但是现在查询“给我所有的鸟”会慢得多。

这当然是一个简单的例子,但它让我想到,在编写专家系统来回答上述查询的上下文中,我真的不知道如何对本质上不是严格分层的复杂关系进行建模。有向循环图似乎可以在数学上解决问题,但是将其存储在关系数据库中并对其进行维护(更新)对我来说似乎是一场噩梦。我想知道人们通常如何为此类事物建模。解释或指向要进一步阅读的资源的指针将是可以接受和赞赏的。

4

3 回答 3

1

您已经遇到了分类法的一个问题(事实上,远非唯一一个,甚至是最糟糕的一个)。 多重继承作为一种概念工具避免了分类法的许多问题——另一种说法是,分类法定义了一棵树,基于 MI 的分类方案定义了一个更一般的有向无环图,因此提供了额外的自由度你的造型。

关系数据库方法会有所不同(不专门考虑层次结构或继承),但会得出与“多重继承”大致相同的概念结果:“类”(在林奈意义上的门/类/顺序/家族/属/物种)是记录的一个领域,饮食(肉食动物、草食动物、杂食动物)是一个独特的领域——它们在概念化和搜索/检索中都不会相互限制。

如果您被迫使用将您限制在分类法(AKA 树、单继承等)的工具进行建模,则有一些技巧可以减轻它们造成的痛苦(在一定程度上),但它们取决于每个工具的特定限制,所以很难一概而论。

于 2010-06-15T04:29:34.003 回答
0

如果您查看有关使用多键模拟大量索引的 MongoDB 手册页,您会看到 MongoDB 允许您在其数据库中为包含各种信息的每种动物创建一个“文档”:

{
  _id: "hawk",
  attribs: [
   {diet: 'carnivore'},
   {kingdom: 'animal'},
   {class: 'Aves'},
   {order: 'Accipitriformes'},
   {locomotion: 'flight'}
  ]
}

然后你可以通过任何你想要的属性组合来查找!

于 2010-06-15T04:29:14.287 回答
0

我使用图形数据库后端的类似问题编写了一个用户角色示例。我最初使用的示例来自这个基于 SQL 的示例。现在我什至不会尝试使用 SQL 来解决这种问题,这太痛苦了。(免责声明:我在Neo4j graphdb 团队)

于 2010-06-15T15:19:16.700 回答