2012-01-30 52 views
3

我試圖把使用Ruby on Rails 3的「電影搜索」應用程序放在一起。我使用SPARQL(RDF和sparql/client)從dbpedia提取數據。我想要一個潛在的用戶能夠搜索電影,查看結果,然後單擊查看我在該電影上生成的包含更多信息(來自dbpedia和我自己的本地數據庫)的頁面。這是一個在我的使用dbpedia和SPARQL的Rails應用程序中實現搜索功能的好方法嗎?有一個更好的方法嗎?

這是我第一次使用龐大的數據集和SPARQL,我注意到它非常慢,我想這是無法幫助的。儘管如此,我仍然非常希望將它用作數據源。

我有我的Rails應用程序設置使用MongoDB,所以我想我可以利用它來緩存一些DBPedia數據,因此用戶不需要等待每一次查詢。不過,我堅持實施這樣的最佳方式。我現在的想法是這些方針的東西:

在第一次搜索過,我存儲每個結果的詳細信息在我的本地數據庫(可能是基本的電影信息,如標題,概述,今年,替代標題)

當用戶執行搜索時,會出現以下情況:

  1. 運行在我的本地數據庫搜索查詢來獲取相關的存儲電影(搜索標題和概要只,最有可能的)。如果在過去的X天內電影還沒有從dbpedia中更新,我不會包含它。
  2. 快速向用戶顯示那些相關的本地結果並製作這些電影的列表。
  3. 當用戶查看存儲的結果時,會查詢dbpedia。從這個查詢結果中,我創建了DBpedia相關結果的列表。
  4. 我從dbpedia查詢結果集中刪除了任何已在初始本地結果集中的影片,以防止用戶看到重複的結果。
  5. 我在本地結果下面顯示剩餘的dbpedia查詢結果,並將每個新的非存儲結果保存在本地數據庫中(包括last_updated時間,並根據需要更新任何現有的本地項目)。
  6. 當用戶點擊一個電影頁面時,dbpedia的基本信息和我存儲的額外信息已經存儲在本地,並且可以在頁面上快速提取,但更高級的信息(導演,語言,位置,鏈接到相關網站)在加載時從dbpedia查詢。我顯示在檢索新信息時在不同部分加載對話框等。

我的想法做一些像上面這樣用戶就可以很快看到一些結果,而其餘結果得到來自DBpedia中加載的,而我存儲一些東西,但不是一個瘋狂的金額。

但我想獲得一些幫助,看它是否現實並且是否是一個好主意。我可以想象,首先搜索我的本地數據庫可能會將用戶的初始結果歪曲爲之前搜索過的內容,並且如果他們特定的期望的電影(如果他們放入標題中)在未顯示之前未進行搜索在列表中。在本地存儲相關數據集(即所有電影)的副本並根據需要更新它會更有意義嗎?那太多了吧?

無論如何,我真的很感激一些建議,儘可能爲用戶提供儘可能無縫的東西,同時仍然處於理智的界限之內。提前致謝!

編輯:這是我正在使用的測試搜索查詢的代碼。我以爲我正在測試中超級超級基礎...但它超時lot

query = " 
    PREFIX owl: <http://www.w3.org/2002/07/owl#> 
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
    PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
    PREFIX dc: <http://purl.org/dc/elements/1.1/> 
    PREFIX : <http://dbpedia.org/resource/> 
    PREFIX dbpedia2: <http://dbpedia.org/property/> 
    PREFIX dbpedia: <http://dbpedia.org/> 
    PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
    PREFIX dbo: <http://dbpedia.org/ontology/> 

    SELECT ?subject ?label ?abstract ?runtime ?date ?name WHERE { 
    {?subject rdf:type <http://dbpedia.org/ontology/Film>} 
    UNION 
    {?subject rdf:type <http://dbpedia.org/ontology/TelevisionShow>}. 
    OPTIONAL {?subject dbo:runtime ?runtime}. 
    OPTIONAL {?subject dbo:releaseDate ?date}. 
    OPTIONAL {?subject foaf:name ?name}. 
    ?subject rdfs:comment ?abstract. 
    ?subject rdfs:label ?label. 
    FILTER((lang(?abstract) = 'en') && (lang(?label) = 'en') && REGEX(?label, '" + str + "')). 

    } 
    LIMIT 30 
" 
result = {} 
client = SPARQL::Client.new("http://dbpedia.org/sparql") 
result = client.query(query).each_binding { |name, value| puts value.inspect } 
return result 

回答

1

什麼是您用來查詢dbpeid的SPARQL查詢?應該可以對此進行優化以提高性能。您還應該能夠使用類別URI進行過濾。你也應該能夠使用OFFSET和LIMIT預測來減少結果的數量。如果您正在使用全文搜索,那麼您可能還會考慮使用特定於Virtuoso的'bif:contains'屬性,因爲正則表達式過濾器有點快,但缺點是非標準/ Virtuoso特定。另外,您還可以使用HTTP緩存來改進後續搜索結果(SPARQL協議通過HTTP運行並不令人驚訝)。

除此之外,您可以嘗試簡單地使用自己的三重存儲並將每天晚上從dbpedia加載的電影加載到mongo數據庫中。

EDITED基於提供查詢的

好簡單地通過反覆試驗,以下模式造成很大的問題:

?subject rdfs:comment ?abstract. 
    ?subject rdfs:label ?label. 
    FILTER((lang(?abstract) = 'en') && (lang(?label) = 'en') && REGEX(?label, '" + str + "')). 

過濾器可能會很慢,但即使沒有過濾器的查詢超時。我會更關心可選的條款(可選可以很慢)。嘗試它沒有。您可能需要爲摘要和標籤運行單獨的查詢。

+0

嗨,謝謝你的迴應!我爲我正在使用的示例查詢添加了一些代碼,只是使用基本的正則表達式來測試一個字符串,但是在我重新測試它的時候,我注意到當它試圖用一個簡單的字符串。我現在會研究你的其他建議。謝謝! – Sarah 2012-01-31 04:40:18

相關問題