Как получить этикетки из Викиданных за приблизительные сроки? - PullRequest
2 голосов
/ 29 апреля 2019

Я использую приведенный ниже запрос для получения метки wikidata для данного термина.

SELECT ?item WHERE {
  ?item rdfs:label "Word2vec"@en
}

Вывод: wd:Q22673982

Однако, когда я пишу Word2vecкак word2vec (т. е. все символы являются простыми буквами). По вышеприведенному запросу я не получил результатов.

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

т.е. если я введу все символы в нижнем регистре, как определить эквивалентный термин викиданных и вернуть соответствующую метку?

Я с радостью предоставлю более подробную информацию, если это необходимо.

Ответы [ 2 ]

5 голосов
/ 29 апреля 2019

Комментарии AKSW - лучшее решение, чем принятый ответ, но поскольку AKSW не имеет привычки публиковать правильные ответы, я сделаю это для него ...

Мы не знаемваш вариант использования, но если вы просто пытаетесь сделать простой поиск в сущностях Wikidata, другие службы, такие как поиск сущностей API MediaWiki, могут быть более эффективными.Вы даже можете использовать его внутри SPARQL, например:

SELECT * {
    SERVICE wikibase:mwapi {
        bd:serviceParam wikibase:api "EntitySearch".
        bd:serviceParam wikibase:endpoint "www.wikidata.org".
        bd:serviceParam mwapi:search "word2vec".
        bd:serviceParam mwapi:language "en".
        ?item wikibase:apiOutputItem mwapi:item.
        ?num wikibase:apiOrdinal true.
    }
    ?item (wdt:P279|wdt:P31) ?type
}
ORDER BY ?num
LIMIT 20

Запустить этот запрос в режиме реального времени

Что происходит в этом запросе?

  1. Вызов SERVICE для wikibase:mwapi - это не стандартный SPARQL, а расширение SPARQL, которое вызывает API Mediawiki, в частности его поиск сущностей.Подробнее об этом в руководстве .Имеет значение поисковый термин как значение для mwapi:search и две строки, которые связывают найденный элемент с переменной ?item, а его ранг в результатах поиска - ?num.
  2. Строка ?item (wdt:P279|wdt:P31) ?type связывает тип каждого элемента с переменной ?type.Он учитывает как свойства «подкласс», так и «экземпляр».
  3. ORDER BY ?num гарантирует, что результаты упорядочены по рангу, то есть лучшее совпадение идет первым, второе наилучшее совпадениевторое и т. д.
  4. LIMIT 20 сохраняет только первые 20 результатов, если их больше 20.
  5. SELECT * означает возвращение всех переменных, которые были связаны в запросе, поэтому в этомв случае, если это будет ?item, ?type и ?num.

Расширение его для нескольких условий поиска

Согласно комментариям, это может быть расширено для запуска для многократного поискатермины:

SELECT * {
    VALUES ?searchTerm { "word2vec" "fasttext" "natural language processing" "deep learning" "support vector machine" }
    SERVICE wikibase:mwapi {
        bd:serviceParam wikibase:api "EntitySearch".
        bd:serviceParam wikibase:endpoint "www.wikidata.org".
        bd:serviceParam wikibase:limit 10 .
        bd:serviceParam mwapi:search ?searchTerm.
        bd:serviceParam mwapi:language "en".
        ?item wikibase:apiOutputItem mwapi:item.
        ?num wikibase:apiOrdinal true.
    }
    ?item (wdt:P279|wdt:P31) ?type
}
ORDER BY ?searchTerm ?num

Запустите этот запрос в реальном времени

  • Условия поиска представлены в предложении VALUES и связаны с переменной ?searchTerm
  • Эта переменная затем используется в служебном вызове
  • LIMIT 20 теперь больше не работает, поскольку ограничивает общее количество результатов вместо одного термина, поэтому я удалил его
  • Вместо этого добавлено wikibase:limit к параметрам сервиса
  • Изменил порядок, так что он сначала упорядочивается по поисковому запросу, а затем по рангу
3 голосов
/ 29 апреля 2019

Если вы не уверены в точном написании или использовании заглавных букв, вы можете использовать функцию фильтра, чтобы выполнить сопоставление.Например, чтобы сопоставить независимо от заглавных букв, вы можете использовать функцию LCASE() (или UCASE()) следующим образом:

SELECT ?item WHERE {
  ?item rdfs:label ?label
  FILTER(LCASE(STR(?label)) = "word2vec")
}

Это преобразует любую найденную метку в нижний регистр, а сравнение сравнивается сстрочная строка.

Существует целый ряд различных функций, которые вы можете использовать для манипуляции со строками. Хороший обзор содержится в рекомендации SPARQL 1.1 W3C .

ПРИМЕЧАНИЕ этот вид запроса значительно дороже (с точки зрения времени выполнения), потому что движок должен будет выполнить последовательное сканирование всех возможных совпадений.Как и @AKSW, упомянутый в комментариях, время ожидания запроса как есть, скорее всего, истечет, когда вы выполните его в общедоступной конечной точке Wikidata.Возможно, это очень поможет, если вы сделаете запрос более конкретным, добавив дополнительные тройные шаблоны.

Обновление Если вы посмотрите на информацию, доступную для wd:Q22673982 (вы можете просмотреть ее на https://www.wikidata.org/wiki/Q22673982), вы увидите, что, среди прочего, этоподкласс "встраивания слова" (wd:Q18395344).Так, что вы могли бы сделать, например, вместо того, чтобы просто запрашивать каждый ?item, который имеет rdfs:label, это запрашивать все элементы, которые являются подклассом wd:Q18395344 и имеют этот ярлык, например:

SELECT DISTINCT ?item WHERE {
  ?item wdt:P279 wd:Q18395344;
        rdfs:label ?label
  FILTER(LCASE(STR(?label)) = "word2vec")
}

К сожалению, Wikidata использует довольно загадочные идентификаторы для своих свойств и отношений.Достаточно сказать, что wdt:P279 соответствует отношению «подкласс».Я добавил DISTINCT, потому что в противном случае вы получите один и тот же ответ 10 или более раз.

...