2016-07-30 1 views
1

私はムービータイトルのリストを持っていて、DBpediaで "director"のようなメタ情報を探しています。しかし、タイトルが正確に一致しないことがあるため、SPARQLで正しいムービーを特定するのは難しいです。SPARQLを使用して文字列に最適な照合をクエリしますか?

を入手するには、をSPARQLを使用してDBpediaの映画のタイトルに一致させるにはどうすればよいですか?

いくつかの問題の例:

  • マイリスト:
  • マイリスト "ダイ・ハード3":DBpediaの対: "ダイ・ハード3" "ハチ" DBpediaの対: 「ハチは:犬の物語」

私の現在のアプローチは、すべての映画のDBpedia endpointを照会して、タイトルでシングル(句読点なし)トークン、順序をチェックすることによってフィルタリングし、最初の結果を返すことです。例:

SELECT ?resource ?title ?director WHERE { 
    ?resource foaf:name ?title . 
    ?resource rdf:type schema:Movie . 
    ?resource dbo:director ?director . 
    FILTER (
     contains(lcase(str(?title)), "die") && 
     contains(lcase(str(?title)),"hard") 
    ) 
} 
ORDER BY (?title) 
LIMIT 1 

このアプローチは非常に低速であり、また、時には失敗し、例えば:

SELECT ?resource ?title ?director WHERE { 
    ?resource foaf:name ?title . 
    ?resource rdf:type schema:Movie . 
    ?resource dbo:director ?director . 
    FILTER (
     contains(lcase(str(?title)), "hachi") 
    ) 
} 
ORDER BY (?title) 
LIMIT 10 

正しい結果が第二位である:

resource           title      director 
    http://dbpedia.org/resource/Chachi_420   "Chachi 420"@en    http://dbpedia.org/resource/Kamal_Haasan 
    http://dbpedia.org/resource/Hachi:_A_Dog's_Tale "Hachi: A Dog's Tale"@en  http://dbpedia.org/resource/Lasse_Hallström  
    http://dbpedia.org/resource/Hachiko_Monogatari "Hachikō Monogatari"@en  http://dbpedia.org/resource/Seijirō_Kōyama 
    http://dbpedia.org/resource/Thachiledathu_Chundan "Thachiledathu Chundan"@en http://dbpedia.org/resource/Shajoon_Kariyal 

任意のアイデアこれを解決する方法問題?またはそれ以上:一般的にSPARQLを使用して文字列に最適な一致を検索するにはどうすればよいですか?

ありがとうございました!

+0

SPARQLエンドポイントはテキスト検索エンジンではないため、SPARQL標準の文字列マッチングのサポートは限られています。トリプルストアの中には、基本的な実装に応じて拡張サポートを提供するものもあります。例えば。一部のトリプルストアではLuceneをテキスト検索に使用していますが、Virtuosoのようなものには組み込み関数がいくつかあります。 – AKSW

+0

DBpediaエンドポイントはVirtuosoを使用していますので、http://docs.openlinksw.com/virtuoso/rdfsparqlrulefulltext/をご覧ください。例えば。 'bif:contains'は、通常のREGEXよりもインデックス付きリテラルではるかに高速です。 docsの例は '?foaf:Name?nameです。 ?name bif: '' rich * '"。"を含んでいます。これは 'foaf:Name'にRichという単語が含まれているすべての主題に一致します。これはリチャード、リッチーなどと一致するでしょう。 – AKSW

+0

@AKSW bif:containsのヒントをありがとう。私はそれを見てみましょう。 – dynobo

答えて

2

私は正規表現のアプローチにmentioned in the commentsを適応と私はBIFに得ることができるものよりも良い、かなりうまく機能するソリューションを思い付いた:含まれています

SELECT ?resource ?title ?match strlen(str(?title)) as ?lenTitle strlen(str(?match)) as ?lenMatch 

    WHERE { 
     ?resource foaf:name ?title . 
     ?resource rdf:type schema:Movie . 
     ?resource dbo:director ?director . 
     bind(replace(LCASE(CONCAT('x',?title)), "^x(die)*(?:.*?(hard))*(?:.*?(with))*.*$", "$1$2$3") as ?match) 
    } 

    ORDER BY DESC(?lenMatch) ASC(?lenTitle) 

    LIMIT 5 

それは完璧ではないので、私はまだ開いています提案のために。

関連する問題