Никаких результатов при запросах с Jena, но форма запроса DBpedia возвращает результаты - PullRequest
1 голос
/ 24 апреля 2019

Результат не тот, если я использую Jena против формы запроса на http://dbpedia.org/sparql

Мой код в Йене (я пытаюсь вернуть два списка, которые содержат типы для искомого текстового имени):

s1 = "Ketolide";
s2 = "Aminocoumarin";
String sparqlQueryString1 = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" +
                        "SELECT  distinct ?type1 " +
                        "WHERE { ?data  rdfs:label ?label1. ?data rdf:type ?type1.   FILTER contains(lcase(str(?label1)),'" + s1.toLowerCase()  + "'). }";

Query query = QueryFactory.create(sparqlQueryString1);

QueryEngineHTTP objectToExec = QueryExecutionFactory.createServiceRequest("http://dbpedia.org/sparql", query);

objectToExec.addParam("timeout","3000");
ResultSet results = objectToExec.execSelect();
List<QuerySolution> s = ResultSetFormatter.toList(results);
ResultSetFormatter.out(System.out, results, query);

sparqlQueryString1 = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " +
                        "SELECT distinct ?type1 " +
                        "WHERE {?data  rdfs:label ?label1. ?data rdf:type ?type1.  FILTER contains(lcase(str(?label1)),'" + s2.toLowerCase()  + "'). }";

query = QueryFactory.create(sparqlQueryString1);

objectToExec = QueryExecutionFactory.createServiceRequest("http://dbpedia.org/sparql", query);
objectToExec.addParam("timeout","3000");
results = objectToExec.execSelect();
List<QuerySolution> s22 = ResultSetFormatter.toList(results);
ResultSetFormatter.out(System.out, results, query);

Когда я использую тот же запрос в форме запроса на http://dbpedia.org/sparql, он получает результаты:

SELECT distinct ?type1 WHERE{ ?data rdf:type ?type1. ?data  rdfs:label  ?label1 .    FILTER contains(lcase(str(?label1)), 'ketolide') .}

Возвращает:

type1

http://dbpedia.org/ontology/ChemicalCompound
http://dbpedia.org/class/yago/WikicatKetolideAntibiotics
http://dbpedia.org/class/yago/Agent114778436
http://dbpedia.org/class/yago/Antibacterial102716205
http://dbpedia.org/class/yago/Antibiotic102716866
http://dbpedia.org/class/yago/CausalAgent100007347
http://dbpedia.org/class/yago/Drug103247620
http://dbpedia.org/class/yago/Matter100020827
http://dbpedia.org/class/yago/Medicine103740161
http://dbpedia.org/class/yago/PhysicalEntity100001930
http://dbpedia.org/class/yago/Substance100020090
http://dbpedia.org/class/yago/WikicatAntibiotics

В чем причина и причина этой разницы?

1 Ответ

1 голос
/ 24 апреля 2019

Я могу заметить две разницы.

  1. Использование графика IRI по умолчанию: Сначала форма запроса на http://dbpedia.org/sparql устанавливает график IRI по умолчаниюдо http://dbpedia.org.Ваш код этого не делает.Таким образом, ваш код будет работать со всеми графами в базе данных, а не только с графом DBpedia.Чтобы добавить тот же график по умолчанию к вашему запросу, это должно сработать:

    objectToExec.addDefaultGraph("http://dbpedia.org");
    

    (я не знаю, какие еще графики есть у конечной точки, поэтому я не знаю, насколько это на самом деле имеет значение.)

  2. Различные таймауты: Во-вторых, ваш код устанавливает тайм-аут на 3000, а форма запроса устанавливает его на 30000. Эта конкретная конечная точка настроена на возврат независимо от того, что онадо сих пор находил, когда истекает время ожидания, поэтому, если он не нашел ничего через 3 секунды, он вернется без результатов.Форма запроса позволяет выполнить запрос в течение 30 секунд.

При этом полнотекстовый поиск можно сделать намного эффективнее, используя bif:contains:

FILTER bif:contains(?label1, 'ketolide')

При этом используется полнотекстовый индекс, который намного быстрее, чем сканирование всех строк в базе данных.

И, наконец, вам следует рассмотреть исправление уязвимости кода вSPARQL впрыск .

...