Использование связанной переменной для ссылки на GRAPH в SPARQL

Раньше я использовал связанные переменные Uri из тройных шаблонов в качестве аргументов GRAPH, но когда я использую результат BIND/URI/CONCAT, показанный ниже, он ведет себя не так, как ожидалось: он не соответствует ни одному известному графику. Я проверил, что переменная ?graph преобразуется в ожидаемый Graph Uri. Если шаблон должен работать, есть ли проблема с областью видимости переменных, которую я упускаю из виду или что-то в этом роде?

       SELECT ?s ?p ?o WHERE
       { 
        GRAPH <http://www.interition.net/g1>
          { 
            <s1> :aProperty ?literal .

            BIND ( URI(CONCAT("http://www.interition.net/graphs/", ?literal )) AS ?graph) .
          }

          GRAPH ?graph { 
                  ?s ?p ?o .
              }
    }

Пример nQuads

<s1> <http://www.interition.net/ref/aProperty> "g2" <http://www.interition.net/g1> .
<s2> <http://www.interition.net/ref/aState> "happy"   <http://www.interition.net/graphs/g2> .

person Interition    schedule 01.09.2014    source источник
comment
Получаете ли вы связанные значения для ?graph вообще? Например, если вы удалите graph graph { ?s ?p ?o } и просто выберите «Literal» и «Graph», что вы получите?   -  person Joshua Taylor    schedule 01.09.2014
comment
Да, если у меня есть SELECT * в проекции и я удаляю второе объявление GRAPH и его блок, я получаю значения ?literal и ?graph с последним в качестве URI. Если я возьму значение URI и предоставлю в качестве аргумента GRAPH блок spo, он сработает.   -  person Interition    schedule 02.09.2014
comment
Можете ли вы показать некоторые данные nquads, чтобы мы могли воспроизвести проблему?   -  person Joshua Taylor    schedule 02.09.2014
comment
Отредактировал вопрос. Я фабрикую запрос и данные, очевидно. Я ищу, чтобы знать, должен ли я ожидать, что это сработает.   -  person Interition    schedule 02.09.2014
comment
@JoshuaTaylor, привет, могу я помочь с дополнительной информацией? Если я должен ожидать, что это сработает, я потрачу больше времени на его изучение.   -  person Interition    schedule 04.09.2014


Ответы (3)


Похоже, проблема связана с используемым нами тройным магазином. Я сфабриковал два фиктивных ttl-файла, которые загрузил в два графика в Jena's Fuseki, и запрос работал так, как это продемонстрировал Энди.

Однако в настоящее время мы используем более старую версию BigData в качестве нашего хранилища в Interition, которая, похоже, не поддерживает этот тип. передачи переменных в графы... Попробую на последнем релизе, а мы еще подумаем, обновляться или переходить на Fuseki. Если проблема сохраняется и в последней версии, я подниму ее перед командой разработчиков.

person adamnogradi    schedule 06.09.2014
comment
Небольшое исправление: BigData работает с передачей переменной графа uri, но не работает, когда вы создаете переменную из литерала с помощью BIND(uri(concat(...) - person Interition; 07.09.2014

Похоже, что <s1> в данных не соответствует <s1> в запросе.

Попробуйте напечатать запрос с помощью «arq.qparse» (или просто напечатать «toString» в программе). Относительный URI для <s1> разрешен.

Как были созданы N-Quads? API не проверяет URI.

Пытаться:

PREFIX  ref:  <http://www.interition.net/ref/>

SELECT  ?graph ?s ?p ?o
WHERE
  { GRAPH <http://www.interition.net/g1>
      { ?s1 ref:aProperty ?literal
        BIND(uri(concat("http://www.interition.net/graphs/", ?literal)) AS ?graph)
      }
    GRAPH ?graph
      { ?s ?p ?o }
  }

Я получил:

-----------------------------------------------------------------------
| graph                                 | s    | p          | o       |
=======================================================================
| <http://www.interition.net/graphs/g2> | <s2> | ref:aState | "happy" |
-----------------------------------------------------------------------
person AndyS    schedule 04.09.2014
comment
Я изготовил вручную, потому что не могу показать реальный запрос или данные. Я не создавал реальный набор данных и не тестировал, так как просто хотел выяснить, должно ли это работать в принципе. Я воспроизведу более подробно и отпишусь. - person Interition; 04.09.2014
comment
Как вы, кажется, заметили, ‹aProperty› тоже проблема. - person AndyS; 04.09.2014
comment
Да, как я уже сказал, он был сфабрикован, поэтому этот код и данные никогда не запускались. Я в принципе спрашивал. У меня есть кто-то, кто делает некоторые фиктивные данные, чтобы опубликовать их, чтобы завершить вопрос. - person Interition; 06.09.2014
comment
Два блока GRAPH соединяются вместе - логически оцениваются два параграфа GRAPH, затем выполняется объединение результатов каждого из них. Оказывается, есть более быстрый способ, который найдет ARQ (форма соединения индекса). Ответ на исходный вопрос - да, вы можете это сделать - person AndyS; 06.09.2014

Эта проблема, вероятно, связана с тем, как реализована оценка запросов в вашем хранилище RDF. Когда оценивается первый блок GRAPH, это приводит к набору привязок для ?graph. Как правило, эта привязка будет применяться к двум группам только на самом последнем этапе оценки запроса, где блоки будут объединены по этой переменной. Не требуется, чтобы он использовался для фактического сопоставления второго шаблона графа. Альтернативным способом написания запроса было бы сопоставление графиков в фильтре:

PREFIX  ref:  <http://www.interition.net/ref/>

SELECT  ?graph ?s ?p ?o
WHERE {
   GRAPH <http://www.interition.net/g1> {
      ?s1 ref:aProperty ?literal
      BIND(uri(concat("http://www.interition.net/graphs/", ?literal)) AS ?graph1)
   }
   GRAPH ?graph2 {
      ?s ?p ?o
   }
   FILTER(?graph1 = ?graph2)
}
person Robin Keskisarkka    schedule 12.06.2017