Фильтрация литералов без языкового тега

#sparql #rdf #jena

#sparql #rdf #jena

Вопрос:

Я пытаюсь отфильтровать некоторые строки по определенному языку, но это литералы без языковых тегов, поэтому я не могу отфильтровать их с помощью «lang» или «langMatches». Похоже, что все результаты соответствуют всем языкам, как я могу их отфильтровать?

Я использую библиотеки Java Jena, и я уже пытался использовать функциональность «регулярных выражений», но это дает мне все результаты, поскольку они отвечают на все языки.

Вот запрос для отображения всех результатов и языков

 String TitleQuery =
      "PREFIX dc: <http://purl.org/dc/elements/1.1/>" 
      "SELECT ?title ?language " 
      "WHERE { ?s dc:title ?title ." 
      "?s dc:language ?language ." 
      "}";
  
 --------------------------------------------------------
| title                                 | language     |
========================================================
| "Espainiako Erkidego Autonomoak"      | "Euskera"    |
| "Espainiako Erkidego Autonomoak"      | "Portuguese" |
| "Espainiako Erkidego Autonomoak"      | "English"    |
| "Espainiako Erkidego Autonomoak"      | "Català"     |
| "Espainiako Erkidego Autonomoak"      | "Italiano"   |
| "Espainiako Erkidego Autonomoak"      | "Français"   |
| "Espainiako Erkidego Autonomoak"      | "Deutsch"    |
| "Espainiako Erkidego Autonomoak"      | "Galego"     |
| "Espainiako Erkidego Autonomoak"      | "Español"    |
| "Comunità autonome della Spagna"      | "Euskera"    |
| "Comunità autonome della Spagna"      | "Portuguese" |
| "Comunità autonome della Spagna"      | "English"    |
| "Comunità autonome della Spagna"      | "Català"     |
| "Comunità autonome della Spagna"      | "Italiano"   |
| "Comunità autonome della Spagna"      | "Français"   |
| "Comunità autonome della Spagna"      | "Deutsch"    |
| "Comunità autonome della Spagna"      | "Galego"     |
| "Comunità autonome della Spagna"      | "Español"    |
| "Comunitats Autònomes d'Espanya"      | "Euskera"    |
[...]
  

Это фильтр регулярных выражений, который я пробовал: FILTER regex(str(?language),"Español")

И это результаты, каждый результат соответствует каждому языку:

 -----------------------------------------------------
| title                                 | language  |
=====================================================
| "Espainiako Erkidego Autonomoak"      | "Español" |
| "Comunità autonome della Spagna"      | "Español" |
| "Comunitats Autònomes d'Espanya"      | "Español" |
| "Comunidades autónomas de España"     | "Español" |
| "Comunidades Autónomas da Espanha"    | "Español" |
| "Communautés Autonomes d'Espagne"     | "Español" |
| "Autonome Gemeinschaften von Spanien" | "Español" |
| "Autonomous Communities of Spain"     | "Español" |
-----------------------------------------------------
  

Комментарии:

1. Это самая базовая часть SPARQL, не так ли? Просто напишите URI или литерал вместо переменной: ?s dc:language "English" . или используйте FILTER(?language = "English") или используйте VALUES ?language {"English" "Deutsch"}

2. И, пожалуйста, покажите регулярное выражение, которое вы пробовали. Я не могу поверить, что он возвращает все результаты.

3. Да, это должно быть так просто, и я прошу прощения, если я задаю основные вопросы, но я новичок в этом, и я так долго пытался это сделать. Я отредактировал сообщение с помощью фильтра регулярных выражений и результатов, которые совпадают с вашими параметрами. Спасибо за вашу помощь! @AKSW

4. Ну, теперь я вижу проблему. Ваш запрос не может работать. И заголовок, и язык определены только для ресурсов. Итак, допустим, что у одного ресурса :r1 есть некоторые названия t1, t2, ..., tn и некоторые языки l1, l2, ..., ln . Но вам нужна какая-то связь между заголовком и языком, которой у вас нет. Кто создал dataset, в его текущем виде это не имеет смысла. Для каждой пары (заголовок, язык) требуется либо пустой узел, например r1 :hasTitle [:value :t1; :language :l1] , либо заголовки должны использовать языковые теги. В противном случае вы потеряны. Проблема не в вашем запросе, а в наборе данных

Ответ №1:

Проблема в том, что и заголовок, и язык определены только для ресурсов. Итак, у одного ресурса, скажем :r1 , есть некоторые названия t1, t2, ..., tn и некоторые языки l1, l2, ..., ln . Но вам нужна какая-то связь между заголовком и языком, которой у вас нет.

Набор данных не имеет смысла в его текущей форме. Для каждой пары (заголовок, язык) требуется либо пустой узел, например r1 :hasTitle [:value :t1; :language :l1] , либо заголовки должны использовать языковые теги. В противном случае вы заблудились. Проблема не в вашем запросе, а в наборе данных.