SPARQL: BIND одной и той же переменной снаружи и внутри группы - PullRequest
4 голосов
/ 14 мая 2019

Допустимо ли использование BIND?

# Query 1
SELECT * {
  BIND (<http://ex/p2> as ?p)
  {
    BIND (<http://ex/p1> as ?p)
    ?s ?p ?o
  }
}

При запуске на данных черепахи:

@prefix h: <http://ex/> .
h:s1 h:p1 h:o1 .
h:s2 h:p2 h:o2 .

arq 3.11.0 дает в результате:

-------------
| p | s | o |
=============
-------------

без выдачи ошибки (даже при использовании --strict). Но удаление группы или изменение порядка выдает ошибку:

# Query 2
SELECT * {
  BIND (<http://ex/p2> as ?p)
  BIND (<http://ex/p1> as ?p)
  ?s ?p ?o
}

BIND: Variable used when already in-scope: ?p in BIND(<http://ex/p1> AS ?p)

и

# Query 3
SELECT * {
  {
    BIND (<http://ex/p1> as ?p)
    ?s ?p ?o
  }
  BIND (<http://ex/p2> as ?p)
}

BIND: Variable used when already in-scope: ?p in BIND(<http://ex/p2> AS ?p)

Вопросы:

  1. нарушает ли запрос 1 10.1 BIND , в котором говорится:

    Переменная, введенная предложением BIND, не должна использоваться в шаблон группового графа до точки использования в BIND.

  2. Мое чтение 18.2.1 Переменная сфера в запросе 1 переменная ?p находится в области видимости внутри внутренняя группа и, следовательно, также внутри области действия за пределами группы. Будет ли сообщение об ошибке arq для Query 2 также применимо к Запрос 1?

Буду признателен за разъяснения.

1 Ответ

2 голосов
/ 14 мая 2019
  1. Нет, запрос 1 не нарушает правила для BIND, и запрос действителен. Это потому, что оценка запросов групп в SPARQL определяется наизнанку. Внутренние группы оцениваются отдельно и перед внешними группами. Если внутренняя группа берется сама по себе, использование BIND в ней, очевидно, хорошо, потому что ?p еще не было связано в группе. В тексте спецификации, который вы цитируете, две ключевые части: «не должен был использоваться… в шаблоне группового графика до момента использования в BIND».
  2. Переменные в области видимости должны быть определены для каждого предложения в группе отдельно, или, другими словами, в разных местах в группе, разные переменные находятся в области видимости. Для внешней группы в Запросе 1 до BIND переменные не находятся в области видимости, и, следовательно, BIND является допустимым. После того, как BIND, ?p находится в области видимости, именно поэтому второй BIND выдает ошибку в Запросе 2. Один из способов думать об этом: группа начинается с пустой области действия, и каждое предложение может вносить переменные в группа. Если переменная уже была добавлена ​​предыдущим предложением, BIND может не назначать эту переменную.
...