2011-01-19 21 views
1

ネットをサーフィンして、私はAquabrowserに遭遇しました(クリックする必要はなく、関連する部分の写真を掲載します)。セマンティックグラフを効率的にビルドして保存する方法は?

検索結果を表示し、意味論的にリンクされたエンティティを発見する素晴らしい方法があります。

demosoneから取得したスクリーンショットです。

左側には、入力した単語と関連する単語があります。 これらをクリックすると結果が絞り込まれます。私は映画のエンティティと被験者(世の中-戦争-2または刑務所エスケープなど)とそれらの関係のデータセットを持っているサンプルプロジェクトとして今

aqua

ここで、ユーザーがキーワードで始まるいくつかの使用例を想像してみましょう。 たとえば「第2次世界大戦」。

私は何とか関連キーワードを計算してランク付けしたいと思います。

私はこのようないくつかのSQLクエリを考える:

は「世界戦争2」は、ID 3.基本的にもキーワード世界-war-を持っているすべてのムービーを選択する必要があり

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 

を持っていると仮定しましょう2つの映画が持っているキーワードを検索し、最も興奮しているキーワードを選択します。

私はtheeseのキーワードで私は最高の一致する映画を選択し、同様の映画や関連キーワードを含む素晴らしいタグクラウドを持つことができると思います。

私はこれがうまくいくと思いますが、非常に、非常に、非常に非効率的です。

また、そのレベルまたは関係は1つだけです。

これを行うには、より良い方法が必要ですが、どのように?

私は基本的にエンティティのコレクションを持っています。彼らは異なるエンティティ(映画、俳優、科目、プロットキーワード)などである可能性があります。

私はそれらの間にも関係があります。

エンティティの「意味的距離」を効率的に計算する必要があります。

また、より多くのレベルの関係を実装したいと考えています。

しかし、私は完全に詰まっています。さて、私はさまざまなアプローチを試みましたが、計算に時間がかかり、ランタイムが指数関数的に増加するいくつかのアルゴリズムですべてが終わりました。

最適化されたデータベースシステムはありますか?

誰かが正しい方向に向かうことができますか?

答えて

5

おそらくRDF triplestoreが必要です。 Redlandはかなり一般的に使用されているものですが、実際にはあなたのニーズに依存しています。クエリはSPARQLで実行され、SQLでは実行されません。また、セマンティックウェブkoolaidを飲む必要があります。

+0

非常に良い+1。私が探していたもののように見えます。素晴らしいリソース –

+0

+1 koolaidのコメントのためだけに私はそれに中毒されてから長い間認めている! – RobV

1

あなたのタグから私はあなたがSQLに精通していると思っています。あなたの仕事に効果的に使用することはまだ可能です。

データベースとしてsqliteを使用してカスタムメイドの全文検索を実装したアプリケーションがあります。検索フィールドには用語を入力することができ、ポップアップリストには単語に関する提案が表示され、次の単語については、以前に入力された単語が出現した記事に表示される単語のみが表示されます。したがって、あなたが記述したタスクに似ています

もっと簡単にするには、3つのテーブルしかないとしましょう。私はあなたが別のスキーマを持っていると思いますが、詳細は異なるかもしれませんが、私の説明はちょうどアイデアを与えることです。

  • 言葉 [ID、Wordの表は、(WordIdでもインデックス化)の単語(キーワード)

  • インデックス [ID、WordId、情報でarticleID] この表は、この用語が登場記事が一覧表示されます含まれています

  • ArticleRanges [情報でarticleID、IndexIdFrom、IndexIdTo] この表は(明らかにも情報でarticleIDによって索引付け)任意の記事のIndex.Idの範囲を示しています。このテーブルでは、新しい記事や更新された記事のインデックステーブルには、from-toの範囲を持つエントリが含まれている必要があります。私はそれが言葉あなた

    • 交差するすべての以前の単語が登場し、すべての記事を任意の与えられた文字列を

    だから、オートインクリメント機能の少しの助けを借りて任意のRDBMSで達成することができると仮定します。これにより検索が絞り込まれます。 SELECT ArticleId FROM Index WordId = ... INTERSECT ...

  • ArticleRangesテーブルからレコードの範囲を取得することができます。
  • この範囲では、効果的にWordIdリストをクエリして結果をグループ化して取得できますカウントし、最後にそれを並べ替えます。

私はそれらを別々のアクションとして列挙しましたが、最後のクエリは、解析されたクエリ文字列に基づいた大きなSQLにすぎません。

+0

偉大なアイデア、もう一度それを徹底的に歩くことを得たが、私は原則を得る! –

関連する問題