Geração de pares

A principal funcionalidade do pacote reside na geração de pares de questão-sparql a partir de um template previamente estabelecido, vamos definir um template inicial que retorna poucos resultados para critério de compreensão.

question query generator_query
Yoshihiro Togashi é autor de <A>? ask where { <A> dbo:author dbr:Yoshihiro_Togashi } select distinct ?a where { ?a dbo:author dbr:Yoshihiro_Togashi }

Realizando a consulta

Esse template é utilizado no formato de dicionário, onde cada chave corresponde ao nome da coluna, a chave variables corresponde as variáveis do tipo ?letra localizadas entre select e o where da generator_query.

>>> template = {"question": "Yoshihiro Togashi é autor de <A>?",
...             "query": "ask where { <A> dbo:author dbr:Yoshihiro_Togashi }",
...             "generator_query": "select distinct ?a where { ?a dbo:author dbr:Yoshihiro_Togashi }",
...             "variables": ["a"]}
>>> gquery = template["generator_query"]
>>> variables = template["variables"]

Dado esse template, inicialmente, iremos realizar o ajuste da generator_query adicionando o label do recurso armazenado na variável a. Para isso, realizamos a chamada da função de ajuste da generator_query:

>>> from QApedia.generator import adjust_generator_query
>>> gquery = adjust_generator_query(gquery, variables)
>>> print(gquery)
select distinct ?a ?la where {?a rdfs:label ?la. FILTER(lang(?la) = 'pt').  ?a dbo:author dbr:Yoshihiro_Togashi }

Em seguida, pode ser utilizada a função de busca perform_query para realizar essa consulta. A consulta é realizada sobre a base da DBpedia, então não precisamos mudar valor padrão da função endpoint="http://dbpedia.org/sparql".

>>> from QApedia.generator import perform_query
>>> results = perform_query(gquery)
>>> for instance in results:
...     print("%s: %s" %(instance["la"].value, instance["a"].value))
...
Level E: http://dbpedia.org/resource/Level_E
Yu Yu Hakusho: http://dbpedia.org/resource/Yu_Yu_Hakusho
Hunter × Hunter: http://dbpedia.org/resource/Hunter_×_Hunter

Outra forma de obter os resultados direto sobre a generator_query é utilizando o método get_results_of_generator_query.

>>> from QApedia.generator import get_results_of_generator_query
>>> generator_query = "select distinct ?a where { ?a dbo:author dbr:Yoshihiro_Togashi }"
>>> variables = ["a"]
>>> results = get_results_of_generator_query(generator_query, variables)
>>> for instance in results:
...     print("%s: %s" %(instance["la"].value, instance["a"].value))
...
Level E: http://dbpedia.org/resource/Level_E
Yu Yu Hakusho: http://dbpedia.org/resource/Yu_Yu_Hakusho
Hunter × Hunter: http://dbpedia.org/resource/Hunter_×_Hunter

Construindo os pares

Para a geração dos pares de questão-sparql, utilizamos a função extract_pairs, ela recebe como parâmetro:

  • resultado da busca no formato retornado pelo exemplo anterior
  • template da busca
  • quantidade de pares que você deseja gerar, se a busca retornar mais do que esse valor, ela é limitada por essa quantidade.
  • lista de prefixos, caso deseje que os recursos retornados no formato <http://dbpedia.org/...> sejam substituídos pelo prefixo especificado.

Exemplo 1

>>> from QApedia.generator import extract_pairs
>>> pairs = extract_pairs(results, template, 2)
>>> for pair in pairs:
...     print(pair["question"])
...     print(pair["sparql"])
...     print("----")
...
Yoshihiro Togashi é autor de Level E?
ask where { <http://dbpedia.org/resource/Level_E> dbo:author dbr:Yoshihiro_Togashi }
----
Yoshihiro Togashi é autor de Yu Yu Hakusho?
ask where { <http://dbpedia.org/resource/Yu_Yu_Hakusho> dbo:author dbr:Yoshihiro_Togashi }
----

Exemplo 2

>>> from QApedia.generator import extract_pairs
>>> from QApedia.utils import convert_prefixes_to_list
>>> prefixes = "PREFIX dbr:<http://dbpedia.org/resource/>\
...             PREFIX dbo:<http://dbpedia.org/ontology/>"
>>> list_of_prefixes = convert_prefixes_to_list(prefixes)
>>> list_of_prefixes
[('dbr:', 'http://dbpedia.org/resource/'), ('dbo:', 'http://dbpedia.org/ontology/')]
>>> pairs = extract_pairs(results, template, 2, list_of_prefixes)
>>> for pair in pairs:
...     print(pair["question"])
...     print(pair["sparql"])
...     print("----")
...
Yoshihiro Togashi é autor de Level E?
ask where { dbr:Level_E dbo:author dbr:Yoshihiro_Togashi }
----
Yoshihiro Togashi é autor de Yu Yu Hakusho?
ask where { dbr:Yu_Yu_Hakusho dbo:author dbr:Yoshihiro_Togashi }
----

Caso deseje substituir alguns símbolos da sparql por elementos textuais, você pode fazer isso através da função encode, para retornar a um formato válido novamente, basta utilizar o decode.

>>> from QApedia.utils import encode, decode
>>> for pair in pairs:
...     encoded = encode(pair["sparql"], list_of_prefixes)
...     decoded = decode(encoded, list_of_prefixes)
...     print(pair["question"])
...     print("====Encoded sparl====")
...     print(encoded)
...     print("====Decoded sparl====")
...     print(decoded)
...     print("----")
Yoshihiro Togashi é autor de Level E?
====Encoded sparl====
ask where  bracket_open  dbr_Level_E dbo_author dbr_Yoshihiro_Togashi  bracket_close
====Decoded sparl====
ask where { dbr:Level_E dbo:author dbr:Yoshihiro_Togashi }
----
Yoshihiro Togashi é autor de Yu Yu Hakusho?
====Encoded sparl====
ask where  bracket_open  dbr_Yu_Yu_Hakusho dbo_author dbr_Yoshihiro_Togashi  bracket_close
====Decoded sparl====
ask where { dbr:Yu_Yu_Hakusho dbo:author dbr:Yoshihiro_Togashi }
----