2012-01-30 1 views
3

Ruby on Rails 3을 사용하여 "영화 검색"응용 프로그램을 만들려고합니다. SPARQL (RDF 및 sparql/client)을 사용하여 dbpedia에서 데이터를 가져옵니다. 잠재적 인 사용자가 동영상을 검색하고 결과를 확인한 다음 클릭하여 더 많은 정보 (dbpedia 및 자체 로컬 데이터베이스 모두 포함)가 포함 된 해당 영화에서 생성 한 페이지를 봅니다.dbpedia와 SPARQL을 사용하는 Rails 애플리케이션에서 검색 기능을 구현하는 좋은 방법일까요? 이 작업을 수행하는 더 좋은 방법이 있습니까?

거대한 데이터 세트와 SPARQL을 사용하는 것은 이번이 처음이며, 매우 느린 것으로 나타났습니다. 도움이 될 것 같지 않습니다. 그래도 여전히 데이터 소스로 사용하고 싶습니다.

MongoDB를 사용하기 위해 레일 앱을 설정 했으므로 사용자가 매번 쿼리를 기다릴 필요가 없도록 DBPedia 데이터 일부를 캐시 할 수 있다고 생각했습니다. 그러나 나는 이런 식으로 뭔가를 구현하는 최선의 방법에 붙어있어. 내가

(제목, 개요, 해, 다른 제목으로 아마 기본적인 영화 정보)를 내 로컬 데이터베이스에 각 결과에 대한 정보를 저장, 지금까지

첫 번째 검색에서 : 나의 현재 생각은이 라인을 따라 뭔가 사용자가 검색을 수행, 다음이 발생

  1. 이 (제목과 개요 만, 대부분 검색) 관련 저장된 영화를 얻기 위해 내 로컬 데이터베이스의 검색 쿼리를 실행하십시오. 지난 X 일 동안 dbpedia에서 영화를 업데이트하지 않은 경우 영화를 포함시키지 않습니다.
  2. 해당 지역 결과를 사용자에게 신속하게 표시하고 해당 영화의 목록을 만드십시오.
  3. 사용자가 저장된 결과를 보는 동안 dbpedia가 쿼리됩니다. 이 쿼리 결과에서 DBpedia의 관련 결과 목록을 만듭니다.
  4. 초기 로컬 결과 세트에있는 영화를 dbpedia 쿼리 결과 세트에서 제거하여 사용자가 중복 결과를 보지 못하도록합니다.
  5. 로컬 결과 아래에 나머지 dbpedia 쿼리 결과를 표시하고 last_updated 시간을 포함하여 새로운 로컬 데이터베이스에 각각 저장되지 않은 새 결과를 저장하고 필요에 따라 기존 로컬 항목을 업데이트합니다.
  6. 사용자가 동영상 페이지로 클릭하면 dbpedia의 기본 정보와 저장중인 추가 정보가 이미 로컬에 저장되어 있으므로 페이지에서 신속하게 끌어 올 수 있지만 고급 정보 (감독자, 언어, 위치, 관련 사이트에 대한 링크)는로드 할 때 dbpedia에서 쿼리됩니다. 새 정보가 검색되는 동안 다른 섹션에서 대화 상자 등을로드하는 것을 보여줍니다.

나는 나머지 결과를 dbpedia에서로드되는 동안 그래서 사용자가 신속하게 몇 가지 결과를 볼 수 있습니다 위의 같은 일을 생각하고 있었는데, 나는 몇 가지가 아니라 미친 양을 저장하고있다.

그러나 이것이 현실적인 지 여부와 좋은 생각인지에 대한 도움을 받고 싶습니다. 로컬 DB를 먼저 검색하면 이전에 검색 한 내용에 대해 사용자의 초기 결과가 왜곡 될 수 있으며 추가로 표시되기 전에 해당 특정 원하는 영화 (예 : 제목에 넣은 경우)가 검색되지 않은 것으로 상상할 수도 있습니다 목록 내려 놔. 관련 데이터 세트 (즉, 모든 영화)의 복사본을 로컬에 저장하고 필요에 따라 업데이트하는 것이 더 합리적일까요? 그것은 너무 많은 것입니다, 그렇죠?

어쨌든 나는 사용자의 가능한 한 매끄러운 환경을 유지하면서 좋은 일을하는 데 도움이되는 제안을 보내 주시면 감사하겠습니다. 미리 감사드립니다!

편집 : 다음은 현재 사용중인 테스트 검색어에 대한 코드입니다. 나는 그것을 테스트를 위해 슈퍼 슈퍼 기초로 만들고 있다고 생각했지만 ... 많은 시간이입니다.

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 특정 단점이 있지만 정규식 필터가 조금 더 빠르기 때문에 Virtuoso Specific 'bif : contains'속성을 사용할 수도 있습니다. 또한 HTTP 캐싱을 사용하여 후속 검색 결과를 향상시킬 수도 있습니다 (SPARQL 프로토콜은 HTTP를 통해 놀랍지 않게 작동합니다).

mongo db에 물건을 넣는 대신, 자신의 triplestore를 사용하고 매일 밤 dbpedia의 영화를로드하려고 할 수 있습니다.

편집을 할 쿼리의 규정에 따라

확인 단순히 시행 착오에 의해, 다음과 같은 패턴을 일으키는 큰 문제 :

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

필터가 느릴 수 있지만, 심지어 쿼리 필터없이 시간 초과되었습니다. 나는 OPTIONAL 절에 더 관심이 있었을 것이다 (OPTIONAL은 느릴 수있다). 그것을 시도하십시오. 초록 및 레이블에 대해 별도의 쿼리를 실행해야 할 수도 있습니다.

+0

안녕하세요, 응답 해 주셔서 감사합니다. 내가 사용하고있는 예제 쿼리를위한 코드를 추가했다. 단지 문자열을 테스트하기위한 기본 정규식을 사용했지만, 지금은 다시 테스트 할 때 간단한 문자열로 실행하려고하면 시간이 많이 걸린다는 사실을 눈치 챘다. . 나는 너의 다른 제안을 지금 살펴볼 것이다. 고맙습니다! – Sarah