2010-06-15 98 views
1

为了获得一些经验,我试图制作一个专家系统,可以回答关于动物王国的查询。但是,我遇到了模拟域的问题。我原来认为是动物王国层次要绘制像建模复杂的层次结构

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

这我想通将让我进行查询轻松地像“给我所有的鸟”,但会更贵说“给我所有的食肉动物” ,所以我重写层次的样子:

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

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

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

回答

0

如果你看一看上Using Multikeys to Simulate a Large Number of Indexes MongoDB的手册页,你会看到的MongoDB将让您创建一个在每个动物数据库“文件”,其中包含的各种信息:

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

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

1

你已经遇到了分类法中的一个问题(实际上远非唯一的问题,甚至最差的问题)。 多重继承作为一个概念工具,避免了分类法的许多问题 - 另一种说法是,分类法定义了一棵树,一个基于MI的分类方案定义了一个更一般的有向无环图,因此提供了额外的程度自由在你的建模中。关系数据库的方法会有所不同(特别是没有考虑层次结构或继承),但会产生与“多重继承”相同的概念结果:“类”(在Linnaeus意义上的门/类/顺序/家庭/属/物种)是记录的一个领域,饮食(食肉动物,草食动物,杂食动物)是一个独特的领域 - 它们不相互约束,既不在概念化,也不在搜索/检索中。如果您被迫使用限制分类法的工具进行建模(AKA树,单继承,& c),有一些技巧可以改善它们造成的痛苦(适度),但它们取决于每个工具的具体限制,所以很难一概而论。

0

我写了一个user roles example使用类似的问题与Graph database后端。我使用的示例最初来自this基于SQL的示例。现在我甚至不会尝试使用SQL来解决这类问题,这是一件非常痛苦的事情。 (免责声明:我在0123dbgraphdb团队)