2017-01-24 19 views
0

私は、2つのSPARQLクエリを使用してDBpediaをクエリするPythonスクリプトを用意しています。それぞれのクエリに対して、結果をリストに入れます。次に、このリストを作成して重複を削除し、必要な結果が得られます。このプロセスをスピードアップするためにクエリを組み合わせる可能性がある場合、これは非効率的なやり方です。2クエリの結果を結合

SQL SPARQLで経験を積んだ人は、これらのクエリを組み合わせてPythonスクリプトを高速化できますか?

コンテキストの場合:私はこの関数(クエリ1)に与えるクエリワードのDBpediaページのすべてのプロパティのプロパティと値の両方のラベル名を必要とし、数値/テキスト値を持ち、値としてのラベル(クエリ2)。

def querydbpedia(queryword): 
mylist = list() 
sparql = SPARQLWrapper("http://dbpedia.org/sparql") 
sparql.setQuery(""" 
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

    SELECT DISTINCT ?pLabel ?oLabel ?o WHERE { 
    <http://dbpedia.org/resource/""" + queryword + """> ?p ?o. 
    ?p rdfs:label ?pLabel . 
    ?o rdfs:label ?oLabel . 
    FILTER(LANG(?pLabel) = "" || LANGMATCHES(LANG(?pLabel), "en")) 
    FILTER(LANG(?oLabel) = "" || LANGMATCHES(LANG(?oLabel), "en")) 
    } 
""") 

sparql.setReturnFormat(JSON) 
results = sparql.query().convert() 

for result in results["results"]["bindings"]: 
    mystr = (result["pLabel"]["value"] + " - " + result["oLabel"]["value"]).lower() 
    mylist.append(mystr) 

sparql.setQuery(""" 
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

    SELECT DISTINCT ?pLabel ?oLabel ?o WHERE { 
    <http://dbpedia.org/resource/""" + queryword + """> ?p ?o. 
    ?p rdfs:label ?pLabel . 
    OPTIONAL {?o rdfs:label ?oLabel} . 
    FILTER(LANG(?pLabel) = "" || LANGMATCHES(LANG(?pLabel), "en")) 
    FILTER(LANG(?o) = "" || LANGMATCHES(LANG(?o), "en")) 
    } 
""") 

sparql.setReturnFormat(JSON) 
results = sparql.query().convert() 

for result in results["results"]["bindings"]: 
    mystr = (result["pLabel"]["value"] + " - " + result["o"]["value"]).lower() 
    if not ("abstract" in mystr): 
    mylist.append(mystr) 

mylist = list(set(mylist)) 
return mylist 

答えて

1

SPARQL UNIONを使用できます。

また、SPARQL 1.1 VALUESを使用して、複数のリソースに同じクエリを適用できます。たとえば -

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
    SELECT DISTINCT ?s ?pLabel ?oLabel ?o WHERE { 
    ?s ?p ?o. 
    VALUES ?s {<http://dbpedia.org/resource/Leipzig> <http://dbpedia.org/resource/Dresden>} 
    ?p rdfs:label ?pLabel . 
    ?o rdfs:label ?oLabel . 
    FILTER(LANG(?pLabel) = "" || LANGMATCHES(LANG(?pLabel), "en")) 
    FILTER(LANG(?oLabel) = "" || LANGMATCHES(LANG(?oLabel), "en")) 
    } 
+0

UNIONは私が探しているものですが、私は自分でこれをやろうとしましたが、正しくできないようです。これらのクエリのUNIONを行うと、元の2つのクエリと同じ結果が表示されないようです。これらのクエリでUNIONをどのように実行する必要がありますか? – Nick

+0

代わりにVALUESを使用できないのはなぜですか?これははるかに便利です。それは動作しませんか? – AKSW

+0

あなたが試したUNIONクエリを表示できますか?何が問題なの?この場合、サブジェクトの変数を保持する必要があります。そうでなければ、両方のリソースを区別できません。 – AKSW

関連する問題