Поскольку вопрос написан, есть несколько возможных проблем. Судя по комментариям, первая из описанных здесь проблем (о lang
, langMatches
и т. Д.) Кажется тем, с чем вы на самом деле сталкиваетесь, но я оставлю описания других возможных проблем, на случай, если кто-то другой сочтет их полезными.
lang
, langMatches
и пустая строка
lang
должен возвращать ""
для литералов без языковых тегов. Согласно RFC 4647 2.1 языковые теги определяются следующим образом:
2.1. Базовый языковой диапазон
«Базовый языковой диапазон» имеет тот же синтаксис, что и языковой тег [RFC3066], или представляет собой одиночный символ «*». Базовый диапазон языков был первоначально описан в HTTP / 1.1 [RFC2616] и позже [RFC3066]. Он определяется следующим ABNF [RFC4234]:
language-range = (1*8ALPHA *("-" 1*8alphanum)) / "*"
alphanum = ALPHA / DIGIT
Это означает, что ""
на самом деле не является юридическим языковым тегом. Как отметил Джин Брукстра в answer.semanticweb .com, в рекомендации SPARQL говорится:
SPARQL предоставляет подмножество функций и операторов, определенных в XQuery Operator Mapping. Раздел 2.2.3 «Обработка выражений» XQuery 1.0 описывает вызов функций XPath. Следующие правила учитывают различия в моделях данных и выполнения между XQuery и SPARQL:…
- Функции, вызываемые с аргументом неправильного типа, вызовут ошибку типа. Эффективные аргументы логического значения (помеченные «xsd: boolean (EBV)» в таблице сопоставления операторов ниже) приводятся к xsd: boolean с использованием правил EBV в разделе 17.2.2.
Поскольку ""
не является тегом юридического языка, его можно рассматривать как «аргумент неправильного типа, [который] вызовет ошибку типа». В этом случае вызов langMatches
приведет к ошибке, и эта ошибка будет рассматриваться как ложная в выражении filter
. Даже если по этой причине он не возвращает false, RFC 4647 3.3.1, который описывает, как сравниваются языковые теги и диапазоны, не говорит точно, что должно происходить при сравнении, так как предполагает допустимые языковые теги:
Базовая фильтрация сравнивает базовые языковые диапазоны с языковыми тегами. Каждый базовый языковой диапазон в списке приоритетов языков рассматривается по очереди в соответствии с приоритетом. Языковой диапазон соответствует определенному языковому тегу, если при сравнении без учета регистра он в точности совпадает с тегом, или если он в точности равен префиксу тега, так что первый символ, следующий за префиксом, равен "-" сильный>. Например, языковой диапазон «de-de» (немецкий, используемый в Германии) соответствует языковому тегу «de-DE-1996» (немецкий, используемый в Германии, орфография 1996 года), но не языковым тегам «de- Deva »(немецкий, написанный письмом Деванагари) или« de-Latn-DE »(немецкий, латинский шрифт, используемый в Германии).
Основываясь на ваших комментариях и моих локальных экспериментах, кажется, что langMatches(lang(?obj),"")
для литералов без языковых тегов (на самом деле, langMatches("","")
) возвращает true в Virtuoso (поскольку он установлен в DBpedia), ARQ Jena (из моих экспериментов) и Proégé (из наших эксперименты), и он возвращает false (или ошибку, которая была приведена к false) в RDFlib.
В любом случае, поскольку lang
определен для возврата ""
для литералов без языкового тега, вы сможете надежно включить их в свои результаты, изменив langMatches(lang(?obj),"")
на lang(?obj) = ""
.
Проблемы с данными, которые вы используете
Вы запрашиваете разные данные. Данные, которые вы загружаете из
взято из DBpedia, но когда вы запускаете запрос к
вы запускаете его в DBpedia Live, который может иметь другие данные. Если вы запустите этот запрос на конечной точке DBpedia Live и на конечной точке DBpedia, вы получите другое количество результатов:
SELECT count(*) WHERE {
dbpedia:Johann_Sebastian_Bach ?pred ?obj
FILTER( langMatches(lang(?obj), "") || langMatches(lang(?obj), "EN" ) )
}
Результаты DBpedia Live 31
результаты DBpedia 34
Проблемы с distinct
Другая возможная проблема, хотя она, похоже, не та, с которой вы столкнулись, заключается в том, что ваш второй запрос имеет модификатор distinct
, а ваш первый - нет. Это означает, что ваш второй запрос может легко дать меньше результатов, чем первый.
Если вы запустите этот запрос к конечной точке DBpedia SPARQL, вы должны получить 34 результата, независимо от того, используете ли вы модификаторы distinct
, и это число, которое вы должны получить, если загрузите данные и выполните тот же запрос к ним.
select ?pred ?obj where {
dbpedia:Johann_Sebastian_Bach ?pred ?obj
filter( langMatches(lang(?obj), "") || langMatches(lang(?obj), "EN") )
}
результаты SPARQL
person
Joshua Taylor
schedule
26.11.2013
lang
возвращает""
для литералов, у которых нет языкового тега. Я не уверен, какlangMatches
обрабатывает""
, но что произойдет, если вы изменитеlangMatches(lang(?obj),"")
наlang(?obj) = ""
? - person Joshua Taylor   schedule 27.11.2013lang(x)
для буквальногоx
, не имеющего языкового тега, возвращалNone
вместо""
. Он упоминается в этой проблеме. - person Joshua Taylor   schedule 27.11.2013