как устранить пустые наборы результатов в SPARQL? - PullRequest
2 голосов
/ 02 декабря 2011

Я делаю проект в семантической сети. Это пример файла RDF, который я использую

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="http://www.xmlns.com/foaf/0.1">
<rdf:Description>
    <foaf:name>aricent</foaf:name>
   <foaf:url>www.placementhub.net</foaf:url>
  </rdf:Description>
</rdf:RDF>

если пользователь вводит «подготовить к aricent» для поиска по ссылке, я кодировал таким образом, чтобы принимать каждое значение «подготовить», «для», «aricent» и динамически генерировать запрос SPARQL, чтобы найти соответствующую запись. SPARQL-запрос

String queryString = "PREFIX rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# "+ "PREFIX foaf: http://www.xmlns.com/foaf/0.1" + "SELECT? Name? Url WHERE {? Foaf: name? Name FILTER regex (? Name, '" + values ​​[i] + "')? Foaf: url? Url}";

где значения [i] теперь «готовятся» в 1-м цикле, «для» во 2-м цикле и «aricent» в 3-м цикле. В таком случае, если он будет выполнен, я получу как

--------------------------------------
| name       | url                   |
======================================
|            |                       |
--------------------------------------

--------------------------------------
| name       | url                   |
======================================
|            |                       |
--------------------------------------

--------------------------------------
| name       | url                   |
======================================
| "aricent" | "www.placementhub.net" |
--------------------------------------

Таким образом, результирующий набор пуст (без значений) для «prepare» и «for», а результат получен только для «aricent», как это доступно в RDF. Можете ли вы сказать мне, как исключить (только таблицу, которая имеет значение, которое должно быть показано пользователю) полученные пустые наборы результатов? Я использовал API-интерфейс JENA. Спасибо

1 Ответ

5 голосов
/ 02 декабря 2011

Я не уверен, что вы подразумеваете под «исключить», но вы можете сделать все это в одном запросе, например:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://www.xmlns.com/foaf/0.1>
SELECT ?name ?url
WHERE {
  ?a foaf:name ?name
  FILTER regex(?name,'(prepare|for|aricent)')
  ?a foaf:url ?url
}

, который вернет любую строку, содержащую любое из этих слов.

В качестве альтернативы, если вам нужны только строки, содержащие все те слова, которые вы могли бы сделать

  FILTER regex(?name,'prepare')
  FILTER regex(?name,'for')
  FILTER regex(?name,'aricent')

Из вашего вопроса не ясно, чего вы пытаетесь достичь.

...