2010-06-15 145 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團隊)