ФИЛЬТР Дублирующие привязки головок в RDF Collection CONSTRUCT с SPARQL 1.1

Я пытаюсь СОЗДАТЬ полные коллекции RDF с путем к свойствам SPARQL 1.1. Примеры путей к свойствам, которые я видел, могут получить узлы rdf:first, но мне еще предстоит увидеть узел, способный получить всю цепочку, включая bnodes. Ключевые части запроса выглядят так:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX sc: <http://iiif.io/api/presentation/2#>

CONSTRUCT {?range sc:hasCanvases ?listid .
?listid rdf:first ?canvas .
?listid rdf:rest ?mid .
?mid rdf:rest ?node .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}

WHERE {values ?range {<http://some.uri>}
?range sc:hasCanvases ?listid .
values ?e { rdf:first rdf:rest } 
?listid rdf:rest* ?mid . 
?mid ?e ?node FILTER (?mid != ?node). 
?listid rdf:first ?first .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}

В основном это работает, за исключением того, что узел? Listid связывается с каждым rdf:rest ?mid объект в пути свойства.

Существует ограничение referencedOnce в jsonld.fromRDF метод, который делает эти дополнительные тройные головы проблематичными для реконструкции списка с этой библиотекой. Я пробовал множество подзапросов, путей к свойствам и ФИЛЬТРОВ, но довольно застрял на этом. Является ли это возможным?

2 ответа

Решение

Не совсем понятно, о чем вы спрашиваете, но звучит так, как будто вы хотите написать конструктивный запрос, который будет содержать список, который присутствует в данных. Намного проще, если вы предоставите примеры данных и покажете полный запрос, который вы пытаетесь использовать, потому что тогда у нас будет гораздо меньше догадок. Исходя из этого предположения, давайте начнем с некоторых данных. Вот две вещи со свойством, связывающим каждую со списком значений:

@prefix : <urn:ex:>

:a :hasList (1 2 3 4 5) .
:b :hasList (6 7 8 9 0) .

Вот запрос, который получает список, связанный с : a, и создает его:

prefix : <urn:ex:>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

construct {
  ?mid rdf:first ?value ;
       rdf:rest ?tail .
}
where {
  :a :hasList ?list .
  ?list rdf:rest* ?mid .
  ?mid rdf:first ?value .
  ?mid rdf:rest ?tail .
}

И результаты:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="urn:ex:">
  <rdf:Description>
    <rdf:rest rdf:parseType="Resource">
      <rdf:rest rdf:parseType="Resource">
        <rdf:rest rdf:parseType="Resource">
          <rdf:rest rdf:parseType="Resource">
            <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
            <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
            >5</rdf:first>
          </rdf:rest>
          <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
          >4</rdf:first>
        </rdf:rest>
        <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >3</rdf:first>
      </rdf:rest>
      <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
      >2</rdf:first>
    </rdf:rest>
    <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
    >1</rdf:first>
  </rdf:Description>
</rdf:RDF>

Там, где часть может быть даже более краткой, так как вы не используете значение ? List:

  :a :hasList/rdf:rest* ?mid .
  ?mid rdf:first ?value .
  ?mid rdf:rest ?tail .

Я думаю, что вы ищете rdf:rest*/rdf:first идиома, чтобы получить всех членов в списке. Попробуйте следующее (я предполагаю, что ?listid содержит одну или несколько коллекций RDF (список):

SELECT ?node
WHERE {
   values ?sequence {<http://some.uri>}
   ?sequence eg:hasThings ?listid .
   ?listid rdf:rest*/rdf:first ?node .
}
Другие вопросы по тегам