为了获得一些经验,我正在尝试建立一个可以回答关于动物王国的问题的专家系统。但是,我遇到了建模域的问题。我最初认为动物王国的等级制度可以像
那样绘制-animal
-bird
-carnivore
-hawk
-herbivore
-bluejay
-mammals
-carnivores
-herbivores
我认为这样可以让我轻松地查询“给我所有的鸟儿”,但是说“给我所有的食肉动物”会更加昂贵,所以我重写了层次结构看起来像:
-animal
-carnivore
-birds
-hawk
-mammals
-xyz
-herbivores
-birds
-bluejay
-mammals
但现在查询“给我所有鸟类”会慢得多。
这当然是一个简单的例子,但它让我觉得我真的不知道如何在编写专家系统以回答上述查询的上下文中对复杂关系进行建模。一个有向的循环图似乎可以在数学上解决问题,但将其存储在关系数据库中并维护它(更新)对我来说似乎是一场噩梦。我想知道人们通常如何模仿这样的事情。可以接受和赞赏对进一步阅读的资源的解释或指示。
答案 0 :(得分:1)
你已经遇到了分类法中的一个问题(实际上远非唯一的,甚至是最差的问题)。 多重继承作为一种概念工具避免了许多分类法的问题 - 另一种说法是,分类法定义树,基于MI的分类方案定义了更通用的有向无环图,以及因此,您可以在建模中获得额外的自由度。
关系数据库方法会有所不同(不是专门考虑层次结构或继承),而是出现与“多重继承”相同的概念结果:“类”(在Linnaeus意义上的门/类/顺序/族) / genus / species)是记录的一个领域,饮食(食肉动物,食草动物,杂食动物)是一个独特的领域 - 它们在概念化和搜索/检索中都不会相互制约。
如果您被迫使用限制分类法的工具进行建模(AKA树,单一继承和& c),有一些技巧可以改善它们造成的痛苦(在适度的程度上),但它们依赖于每个工具的具体限制,因此很难概括。
答案 1 :(得分: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'}
]
}
然后你可以通过你想要的任何属性组合来查找!
答案 2 :(得分:0)
我使用user roles example后端的类似问题写了Graph database。我最初使用的示例来自基于this SQL的示例。我现在甚至都不会尝试使用SQL来解决这类问题,这真是太痛苦了。 (免责声明:我在Neo4j graphdb团队)