Ruby on Rails 3을 사용하여 "영화 검색"응용 프로그램을 만들려고합니다. SPARQL (RDF 및 sparql/client)을 사용하여 dbpedia에서 데이터를 가져옵니다. 잠재적 인 사용자가 동영상을 검색하고 결과를 확인한 다음 클릭하여 더 많은 정보 (dbpedia 및 자체 로컬 데이터베이스 모두 포함)가 포함 된 해당 영화에서 생성 한 페이지를 봅니다.dbpedia와 SPARQL을 사용하는 Rails 애플리케이션에서 검색 기능을 구현하는 좋은 방법일까요? 이 작업을 수행하는 더 좋은 방법이 있습니까?
거대한 데이터 세트와 SPARQL을 사용하는 것은 이번이 처음이며, 매우 느린 것으로 나타났습니다. 도움이 될 것 같지 않습니다. 그래도 여전히 데이터 소스로 사용하고 싶습니다.
MongoDB를 사용하기 위해 레일 앱을 설정 했으므로 사용자가 매번 쿼리를 기다릴 필요가 없도록 DBPedia 데이터 일부를 캐시 할 수 있다고 생각했습니다. 그러나 나는 이런 식으로 뭔가를 구현하는 최선의 방법에 붙어있어. 내가
(제목, 개요, 해, 다른 제목으로 아마 기본적인 영화 정보)를 내 로컬 데이터베이스에 각 결과에 대한 정보를 저장, 지금까지
첫 번째 검색에서 : 나의 현재 생각은이 라인을 따라 뭔가 사용자가 검색을 수행, 다음이 발생
- 이 (제목과 개요 만, 대부분 검색) 관련 저장된 영화를 얻기 위해 내 로컬 데이터베이스의 검색 쿼리를 실행하십시오. 지난 X 일 동안 dbpedia에서 영화를 업데이트하지 않은 경우 영화를 포함시키지 않습니다.
- 해당 지역 결과를 사용자에게 신속하게 표시하고 해당 영화의 목록을 만드십시오.
- 사용자가 저장된 결과를 보는 동안 dbpedia가 쿼리됩니다. 이 쿼리 결과에서 DBpedia의 관련 결과 목록을 만듭니다.
- 초기 로컬 결과 세트에있는 영화를 dbpedia 쿼리 결과 세트에서 제거하여 사용자가 중복 결과를 보지 못하도록합니다.
- 로컬 결과 아래에 나머지 dbpedia 쿼리 결과를 표시하고 last_updated 시간을 포함하여 새로운 로컬 데이터베이스에 각각 저장되지 않은 새 결과를 저장하고 필요에 따라 기존 로컬 항목을 업데이트합니다.
- 사용자가 동영상 페이지로 클릭하면 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
안녕하세요, 응답 해 주셔서 감사합니다. 내가 사용하고있는 예제 쿼리를위한 코드를 추가했다. 단지 문자열을 테스트하기위한 기본 정규식을 사용했지만, 지금은 다시 테스트 할 때 간단한 문자열로 실행하려고하면 시간이 많이 걸린다는 사실을 눈치 챘다. . 나는 너의 다른 제안을 지금 살펴볼 것이다. 고맙습니다! – Sarah