Как получить краткое описание ресурса с кунжутом?
Я тестировал Sesame 2.7.2, и меня удивил тот факт, что запросы DESCRIBE не включают закрытие пустых узлов [EDIT: правильный термин для этого - CDB для краткого ограниченного описания]
Если я правильно понимаю, спецификация SPARQL довольно свободна и говорит, что возвращаемое на самом деле зависит от провайдера, но я все еще удивлен выбором, поскольку bnodes (в результатах запроса описать) использовать нельзя в последующих запросах SPARQL.
Вопрос в том, как получить закрытое описание ресурса. <uri1>
не делая:
- запрос
DESCRIBE <uri1>
- перебрать результат, чтобы определить, какие объекты являются пустыми узлами
- затем
DESCRIBE ?b WHERE { <uri1> pred_relating_to_bnode_ ?b }
- делать это рекурсивно и связывать, пока найдены узлы
Если я не ошибаюсь, bnodes-глубины 2 должны быть описаны с
DESCRIBE ?b2 WHERE {<uri1> <p1&> ?b . ?b <p2> ?b2 }
разве есть более простой способ сделать это?
Наконец, не будет ли лучше и проще DESCRIBE
вернуть закрытое описание ресурса, где вы все еще можете получить текущий возвращенный результат с чем-то вроде следующего?
CONSTRUCT {<uri1> ?p ?o} WHERE {<uri1> ?p ?o}
РЕДАКТИРОВАТЬ: вот пример закрытого результата, который я хочу получить от Сезама
<urn:sites#1> a my:WebSite .
<urn:sites#1> my:domainName _:autos1 .
<urn:sites#1> my:online "true"^^xsd:boolean .
_:autos1 a rdf:Alt .
_:autos1 rdf:_1 _:autos2
_:autos2 my:url "192.168.2.111:15001"@fr
_:autos2 my:url "192.168.2.111:15002"@en
В настоящее время: DESCRIBE <urn:sites#1>
возвращает мне тот же результат, что и запрос CONSTRUCT WHERE {<urn:sites#1> ?p ?o}
так я получаю только то
<urn:sites#1> a my:WebSite .
<urn:sites#1> my:domainName _:autos1 .
<urn:sites#1> my:online "true"^^xsd:boolean .
1 ответ
Частичные решения с использованием SPARQL
Исходя из ваших комментариев, это еще не точное решение, но учтите, что вы можете описать несколько вещей в данном describe
запрос. Например, учитывая данные:
@prefix : <http://example.org/> .
:Alice :named "Alice" ;
:likes :Bill, [ :named "Carl" ;
:likes [ :named "Daphne" ]].
:Bill :likes :Elaine ;
:named "Bill" .
Вы можете выполнить запрос:
PREFIX : <http://example.org/>
describe :Alice ?object where {
:Alice :likes* ?object .
FILTER( isBlank( ?object ) )
}
и получить результаты:
@prefix : <http://example.org/> .
:Alice
:likes :Bill ;
:likes [ :likes [ :named "Daphne"
] ;
:named "Carl"
] ;
:named "Alice" .
Конечно, это не полное описание, потому что :likes
из :Alice
, а не произвольные предикаты. Но он получает пустые узлы с именем "Carl"
а также "Daphne"
, который является началом.
Большая проблема в кунжуте
Похоже, вам придется сделать что-то вроде того, что описано выше, и, возможно, с несколькими поисками, или вам придется изменить Сезам. Альтернативой написанию некоторого креативного SPARQL является изменение способа, которым Sesame реализует описательные запросы. Некоторые конечные точки делают это относительно легко, но Сезам, кажется, не является одним из них. В 2011 году появилась ветка списка рассылки, Пользовательская реализация SPARQL DESCRIBE, которая, похоже, решает эту проблему.
Роберто Гарсия спрашивает:
Я пытаюсь настроить поведение запросов SPARQL DESCRIBE. Я готов получить что-то похожее на CBD (т.е. все свойства и значения для описанного ресурса плюс все свойства и значения для пустых узлов, связанных с ним).
Я попытался воспроизвести подобное поведение с помощью запроса CONSTRUCT, но производительность не очень хорошая, и запрос становится довольно сложным, если я пытаюсь рассмотреть длинные цепочки свойств, указывающие на пустые узлы, начиная с описанного ресурса.
Джин Брукстра отвечает:
Реализация DESCRIBE в Sesame жестко закодирована в парсере запросов. Его можно изменить только путем адаптации самого синтаксического анализатора, и даже тогда это будет сложно, так как модель запроса также не имеет простого способа выразить это: ей нужно расширение алгебры.
> Если это невозможно, какой-нибудь совет о том, как реализовать это с помощью запросов CONSTRUCT?
Я не уверен, что технически возможно сделать это одним запросом. CBD являются рекурсивными по своей природе, и хотя SPARQL действительно имеет некоторую поддержку рекурсивности (цепочки свойств), проблема заключается в том, что вы должны выполнять промежуточную проверку на каждом шаге цепочки свойств, чтобы увидеть, является ли связанное значение пустым узлом или нет, Это не то, что SPARQL поддерживает "из коробки": цепочки свойств определены только как длина пути в качестве условия остановки.
Возможно, что-то возможно, используя замысловатую комбинацию подзапросов, союзов и опций, но я сомневаюсь в этом.
Я думаю, что лучший обходной путь - вместо этого использовать стандартный формат DESCRIBE, который поддерживает Sesame, и для каждого пустого значения узла в этом результате выполнить отдельный последовательный запрос. Другими словами: вы решаете это вручную.
Единственный другой вариант - зарегистрировать запрос функции для поддержки CBD в Сезам. Я не могу дать никаких гарантий о том, если / когда это будет продолжено, хотя.