Проблема со значениями привязки из дополнительного выбора в Jena ARQ

Я хочу запустить следующий простой тестовый запрос:

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT  ?givenName ?name_count ?temp
WHERE
  { BIND(if(( ?name_count = 2 ), "just two", "definitely not 2") AS ?temp)
    { SELECT DISTINCT  ?givenName (COUNT(?givenName) AS ?name_count)
      WHERE
        { ?y  vcard:Family  ?givenName }
      GROUP BY ?givenName
    }
  }

График, который я запрашиваю, взят из учебника https://jena.apache.org/tutorials/sparql_data.html:

@prefix vCard:   <http://www.w3.org/2001/vcard-rdf/3.0#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://somewhere/MattJones/>  vCard:FN   "Matt Jones" .
<http://somewhere/MattJones/>  vCard:N    _:b0 .
_:b0  vCard:Family "Jones" .
_:b0  vCard:Given  "Matthew" .


<http://somewhere/RebeccaSmith/> vCard:FN    "Becky Smith" .
<http://somewhere/RebeccaSmith/> vCard:N     _:b1 .
_:b1 vCard:Family "Smith" .
_:b1 vCard:Given  "Rebecca" .

<http://somewhere/JohnSmith/>    vCard:FN    "John Smith" .
<http://somewhere/JohnSmith/>    vCard:N     _:b2 .
_:b2 vCard:Family "Smith" .
_:b2 vCard:Given  "John"  .

<http://somewhere/SarahJones/>   vCard:FN    "Sarah Jones" .
<http://somewhere/SarahJones/>   vCard:N     _:b3 .
_:b3 vCard:Family  "Jones" .
_:b3 vCard:Given   "Sarah" .

Теперь проблема в том, что запустить его с помощью Jena:

Query query = QueryFactory.create(theAboveQueryAsString);
QueryExecution qexec = QueryExecutionFactory.create(query, theAboveGraphmodel);
ResultSet execSel = qexec.execSelect();
ResultSetRewindable results = ResultSetFactory.copyResults(execSel);;
ResultSetFormatter.out(System.out, results, query);

выдает этот результат в консоли:

----------------------------------
| givenName | name_count | temp  |
==================================
| "Smith"   | 2          |       |
| "Jones"   | 2          |       |
----------------------------------

имеющие временные значения как нулевые.

С другой стороны, выполняя тот же запрос на том же графике в среде Ontotext GraphDb, я получаю правильный результат (сохраненный в формате CSV):

givenName  |  name_count  |  temp
------------------------------------
Jones      |       2      |  just two
Smith      |       2      |  just two

Может ли быть ошибка в движке ARQ или я что-то упустил? Заранее спасибо.

Я использую jena-arq 3.12.0 Java(TM) SE Runtime Environment (сборка 1.8.0_181-b13) Версия версии Eclipse: 2019-06 (4.12.0)


person Zorz Bronze    schedule 01.08.2019    source источник
comment
Существует соединение между BIND и sub-select. Аргументы шага соединения вычисляются до выполнения соединения. Таким образом, BIND оценивается, подвыборка оценивается отдельно, а результаты объединяются. ?name_count не задан в назначении BIND. Если вы переместите его после подвыборки, он будет применяться к результатам подвыборки,   -  person AndyS    schedule 01.08.2019
comment
Спасибо за ответ. Вы совершенно правы. Мне удалить пост?   -  person Zorz Bronze    schedule 01.08.2019
comment
Это полезный пример для кого-то еще. Позвольте мне написать это более подробно в качестве ответа на принятие.   -  person AndyS    schedule 02.08.2019


Ответы (1)


Существует соединение между BIND и sub-select. Аргументы шага соединения вычисляются до выполнения соединения. Таким образом, BIND оценивается, подвыборка оценивается отдельно, а результаты объединяются. ?name_count не задан в назначении BIND. Если вы переместите его после подвыборки, он будет применяться к результатам подвыборки.

BIND добавляет привязку к результату шаблона перед ним.

(base <http://example/base/>
  (prefix ((rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
           (vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>))
    (project (?givenName ?name_count ?temp)
      (join
        (extend ((?temp (if (= ?name_count 2) "just two" "definitely not 2")))
          (table unit))
        (distinct
          (project (?givenName ?name_count)
           (extend ((?name_count ?.0))
             (group (?givenName) ((?.0 (count ?givenName)))
               (bgp (triple ?y vcard:Family ?givenName))))))))))

Здесь (extend...) является одним из двух аргументов (join...). (table unit) — это «ничего» перед BIND.

Если поставить позже, алгебра:

(base <http://example/base/>
  (prefix ((rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
           (vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>))
    (project (?givenName ?name_count ?temp)
      (extend ((?temp (if (= ?name_count 2) "just two" "definitely not 2")))
        (distinct
          (project (?givenName ?name_count)
            (extend ((?name_count ?.0))
              (group (?givenName) ((?.0 (count ?givenName)))
                (bgp (triple ?y vcard:Family ?givenName))))))))))

и extend (из синтаксиса BIND) работает над (distinct ... подзапроса.

person AndyS    schedule 01.08.2019