Вы не можете выбрать «n-й» пустой узел в SPARQL по двум причинам:
- модель RDF представляет собой множество: тройки неупорядочены.
- пустой узел представляет ресурс без идентификатора, что означает, что он не может быть (напрямую) адресован/идентифицирован.
В RDF/SPARQL вы работаете с пустыми узлами косвенным образом: вместо того, чтобы пытаться обращаться к ним напрямую (что, как мы видели выше, невозможно, поскольку само определение пустого узла состоит в том, что у него нет идентификатора), вы смотрите на вещи, которые связывают их с другими ресурсами, то есть заявления, в которых они участвуют. В конце концов, операторы придают пустому узлу его контекстуальное значение.
В вашем случае: различия между _:b1
и двумя другими пустыми узлами заключаются в утверждениях, в которых они играют роль субъекта. Таким образом, чтобы запросить в SPARQL триплеты, где _:b1
является субъектом, вы должны посмотреть на данные и увидеть, что _:b1
однозначно имеет свойство :p3
со значением :cantaloupe
. Таким образом, вы можете запросить так:
CONSTRUCT { ?s ?p ?o }
WHERE { :Foo :p ?s .
?s :p3 :cantaloupe ;
?p ?o .
}
На заметку: несколько реализаций движка SPARQL предлагают некоторые функции для решения проблемы пустых узлов, не имеющих (глобального) идентификатора. Во многих случаях они вводят какое-то нестандартное расширение синтаксиса или пользовательскую функцию, которая позволяет напрямую обращаться к пустому узлу в запросе SPARQL. Я хочу подчеркнуть, что это нестандартно, вряд ли будет работать на разных конечных точках, и поэтому его лучше избегать.
Если вы обнаружите, что действительно не можете работать без прямого обращения к своим пустым узлам, вам следует подумать о том, чтобы вообще не использовать пустые узлы в своих данных, а вместо этого создать для этих вещей правильные IRI.
ОБНОВЛЕНИЕ Ваше обновление вопроса в основном спрашивает следующее: «Могу ли я использовать какую-то недокументированную функцию в неназванной конкретной реализации SPARQL для выполнения запроса, который, строго говоря, незаконен или не гарантированно даст желаемый результат и сойдет с рук?» Ответ на этот вопрос: вероятно, да, но это зависит от того, какую реализацию SPARQL вы используете, и это очень плохая идея по всем причинам, которые я привел выше.
Многие (большинство?) тройных хранилищ действительно дадут один и тот же результат в том же порядке между запросами на практике, хотя это не гарантируется (я не могу это подчеркнуть), и вам действительно не следует полагаться в теме. Конечно, вы можете получить упорядоченный результат запроса, используя предложение ORDER BY
в своем запросе, но в данном случае это не поможет, поскольку относительный порядок пустых узлов не определен в SPARQL (поэтому механизм запросов может возвращать _:b1
и _:b2
в любом порядке, который он сочтет нужным, даже если есть пункт ORDER BY
). Еще хуже: хотя ваш входной RDF-файл может содержать пустые идентификаторы узлов _:b1
и _:b2
, это не обязательно то, что выдаст запрос SPARQL. Многие тройные хранилища заменяют пустые идентификаторы узлов внутренними идентификаторами, и ваш запрос SPARQL с такой же вероятностью вернет _:genid-908c909aeacc4b6da3d3059e18706d68-b1
вместо простого _:b1
.
И даже если бы вы могли каким-то образом надежно вернуть пустой идентификатор узла: что вы собираетесь с ним делать? Пустой узел пуст. Идентификатор, который он несет, предназначен только для целей внутренней бухгалтерии - вы не можете использовать пустой узел для дальнейших запросов.
Поверьте мне: это плохая идея. Если вы не можете изменить данные, полагайтесь на свойства, которые соединяют пустые узлы и запрашивают их.
person
Jeen Broekstra
schedule
30.09.2015