хотите удалить объект, который не имеет метки из результата - PullRequest
2 голосов
/ 08 апреля 2019

Я хотел бы спросить одну хитрую вещь о лейбле. Использование ключевого слова SERVICE, например SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }, позволяет нам переключать метку языка, когда первое предпочтение не сопоставлено с меткой целевого объекта. Тем не менее, я хочу исключить некоторые объекты, которые не имеют метки. Однако ключевое слово service добавляет объект с меткой Qxxxx, если у объекта нет метки соответствия языка. Как я могу удалить объект из результата? Я знаю, что мы можем отфильтровать это, используя rdfs:label для всех переменных в явном виде, но установка всех переменных rdfs: label для всех переменных - еще одна головная боль. Поэтому я хотел бы знать, как улучшить запрос с помощью SERVICE wikibase:label Я хочу отфильтровать сущность, у которой нет метки. Должен ли я заменить SERVICE на rdfs:label?

    SELECT DISTINCT ?vLabel 
    WHERE { 
    hint:Query hint:optimizer "None" .
    {
        SELECT DISTINCT ?i {
            ?i wdt:P31 wd:Q515.
        }LIMIT 15
    }
        ?v wdt:P937 ?i.
      SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". } 
    }
    LIMIT 3
RESULT:
Q59780594 <- no lang label
Q24642253 <- no lang label

1 Ответ

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

Служба меток Wikidata не предоставляет встроенного способа пропустить ресурсы, у которых нет метки.

Самый простой вариант - заключить запрос в подзапрос в новый * 1003.* запрос и использовать фильтр для удаления любых Qxxxx меток.При этом используется тот факт, что только у реальных меток есть языковой тег:

SELECT ?vLabel {
  {
    SELECT DISTINCT ?vLabel
    ...
  }
  FILTER lang(?vLabel)
}

Редактировать: Ниже приведен мой оригинальный (и неполный) ответ, в котором использовалось регулярное выражение для самой меткиудалить Qxxxx из них.Это также отфильтровывает любые ресурсы, которые на самом деле имеют метку вида Qxxxx, если такие ресурсы существуют в Викиданных.

SELECT ?vLabel {
  {
    SELECT DISTINCT ?vLabel
    ...
  }
  FILTER (!REGEX(?vLabel, "^Q[0-9]+$"))
}
...