mozilla

Revision 254195 of Синтаксис запросов RDF

  • URL ревизии: Руководство_по_шаблонам_XUL/Синтаксис_запросов_RDF
  • Заголовок ревизии: Синтаксис запросов RDF
  • ID ревизии: 254195
  • Создано:
  • Автор: Bektur
  • Это текущая версия? Да
  • комментировать Новая: Давайте рассмотрим простой запрос с двумя условиями. Каждому условию соответствует дочерний узел эл...

Содержание версии

Давайте рассмотрим простой запрос с двумя условиями. Каждому условию соответствует дочерний узел элемента <query>.

<vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
         ref="http://www.xulplanet.com/rdf/A">
  <template>
    <query>
      <content uri="?start"/>
      <triple subject="?start"
              predicate="http://www.xulplanet.com/rdf/relatedItem"
              object="?relateditem"/>
    </query>
    <rule>
      ...
    </rule>
  </template>
</vbox>

Двум условиям запроса сопоставлены два различных тэга. Конструктор шаблонов ничего не будет создавать до тех пор, пока блок <action> пуст. Тем не менее, он имеет возможность скомпилировать правила; именно этот процесс мы и рассмотрим.

Конструктор начинает работу, имея всего один элемент (seed), который определён тэгом <content>. Он задаёт начальную точку для обхода графа. Ясно, что нужно начинать с чего-то; тэг <content> задаёт эту вершину и поэтому должен быть первым условием запроса. Поскольку мы можем иметь только одну начальную точку, может быть использован только один тэг <content>. Таким образом начальный результат будет выглядеть так:

(?start = http://www.xulplanet.com/rdf/A)

Значение переменной ?start определено атрибутом 'uri'. Выбор названия переменной оставлен на ваше усмотрение; как правило, используется название ?uri. Поскольку все правила должны использовать одну и ту же переменную для начальной вершины, назовём её ?start. Она имеет значение 'http://www.xulplanet.com/rdf/A'. Обратите внимание на то, что это соответствует значению атрибута ref, указывающего на требуемый начальный узел. Таким образом, переменная ?start становится контейнером (исходной точкой).

Поскольку тэг <content> ничего больше не делает, т.е. не добавляет никакой новой информации, обработчик переходит к следующему условию <triple>

На самом деле, приведённое описание работы шаблона не совсем корректно; во всяком случае, для данной программной реализации этого механизма. Начальный узел (seed) на самом деле - это внутренняя переменная, указывающая на контейнер; в данном случае это элемент <vbox>; переменная ?start получает значение атрибута ref позже, но это лишь деталь реализации, ненамного улучшающая понимание механизма работы шаблонов. Поэтому положим пока что, что имеется лишь один возможный результат.

После анализа содержимого тэга <content> конструктор переходит к следующему условию, <triple>, которое выглядит примерно так:

<triple subject="?start"
        predicate="http://www.xulplanet.com/rdf/relatedItem"
        object="?relateditem"/>

Условие <triple> используется для перехода по дугам в графе RDF. Атрибут predicate определяет метку дуги, по которой необходимо перемещаться. В данном случае, он имеет значение 'http://www.xulplanet.com/rdf/relatedItem', поэтому конструктор переходит по дугам с этой меткой; он может переходить по направлению, указанному в графе, либо в противоположном направлении, но только в одном направлении для каждого условия. Конструктор сам определяет, в каком направлении необходимо двигаться, в зависимости от того, какие данные известны, а какие нужно найти. Возвращаясь к имеющимся результатам, имеем:

(?start = http://www.xulplanet.com/rdf/A)

Как вы помните, начальный узел (seed) был определён условием <content>. Как вы уже, наверное, догадываетесь, конструктор подставляет значение этой переменной в атрибут subject, получая:

<triple subject="http://www.xulplanet.com/rdf/A"
        predicate="http://www.xulplanet.com/rdf/relatedItem"
        object="?relateditem"/>

На самом деле, конструктор не изменяет элемент triple, но такая условность упрощает понимание работы шаблона. Конструктор просматривает содержимое атрибутов subject и object элемента triple и пытается найти все переменные, использующие эти данные. Переменная ?start имеет значение 'http://www.xulplanet.com/rdf/A', поэтому её значение подставляется в условие. Переменная ?relateditem не имеет никакого значение, поэтому она будет оставлена как есть. После того, как значения переменных подставлены, можно выполнить запрос к графу RDF.

Запрос выявит все дуги, выходящие из вершины 'http://www.xulplanet.com/rdf/A' с меткой, соответствующей предикату 'http://www.xulplanet.com/rdf/relatedItem'. Поскольку переменная ?relateditem неизвестна, конструктор позволяет в качестве объекта любой узел, и просмотрит в источнике данных все утверждения RDF, удовлетворяющие такому условию. В условии <triple> атрибут subject всегда соответствует узлу, из которого выходит дуга, тогда как атрибуту object соответствует узел, в который дуга входит. В данном случае конструктор будет переходить в стандартном направлении, а не в обратном. Давайте снова посмотрим на наш граф:

Image:Template-guide-p2.png

Начиная с вершины A и следуя по дуге relatedItem, можем видеть, что есть три возможных значения для переменной ?relateditem: узлы B, C и D. Это новые данные, поэтому конструктор добавляет их к графу результатов. Поскольку было найдено три узла, набор возможных (промежуточных) результатов выглядит так:

(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/B)
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/C)
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/D)

Вы, должно быть, заметили, что переменная ?start повторяется для каждого результата. Это происходит потому, что конструктор копирует существующие данные для всех промежуточных результатов и добавляет новые данные. Точнее, это не совсем так; конструктор на самом деле использует одну копию результатов, остальные значения - это только ссылки на эту копию.

Это может показаться несколько запутанным, но, когда мы перейдём к рассмотрению примеров, это станет более ясным. Поскольку <triple> был последним условием, конструктор переходит к этапу генерации контента, т.е. будет создано три элемента.

{{ languages( { "en": "en/XUL/Template_Guide/RDF_Query_Syntax" } ) }}

Источник ревизии

<p>Давайте рассмотрим простой запрос с двумя условиями. Каждому условию соответствует дочерний узел элемента &lt;query&gt;.
</p>
<pre>&lt;vbox datasources="http://www.xulplanet.com/ds/sample.rdf"
         ref="http://www.xulplanet.com/rdf/A"&gt;
  &lt;template&gt;
    &lt;query&gt;
      &lt;content uri="?start"/&gt;
      &lt;triple subject="?start"
              predicate="http://www.xulplanet.com/rdf/relatedItem"
              object="?relateditem"/&gt;
    &lt;/query&gt;
    &lt;rule&gt;
      ...
    &lt;/rule&gt;
  &lt;/template&gt;
&lt;/vbox&gt;
</pre>
<p>Двум условиям запроса сопоставлены два различных тэга. Конструктор шаблонов ничего не будет создавать до тех пор, пока блок &lt;action&gt; пуст. Тем не менее, он имеет возможность скомпилировать правила; именно этот процесс мы и рассмотрим.
</p><p>Конструктор начинает работу, имея всего один элемент (seed), который определён тэгом &lt;content&gt;. Он задаёт начальную точку для обхода графа. Ясно, что нужно начинать с чего-то; тэг &lt;content&gt; задаёт эту вершину и поэтому должен быть первым условием запроса. Поскольку мы можем иметь только одну начальную точку, может быть использован только один тэг &lt;content&gt;. Таким образом начальный результат будет выглядеть так:
</p>
<pre>(?start = http://www.xulplanet.com/rdf/A)
</pre>
<p>Значение переменной ?start определено атрибутом 'uri'. Выбор названия переменной оставлен на ваше усмотрение; как правило, используется название ?uri. Поскольку все правила должны использовать одну и ту же переменную для начальной вершины, назовём её ?start. Она имеет значение '<span class="nowiki">http://www.xulplanet.com/rdf/A</span>'. Обратите внимание на то, что это соответствует значению атрибута ref, указывающего на требуемый начальный узел. Таким образом, переменная ?start становится контейнером (исходной точкой).
</p><p>Поскольку тэг &lt;content&gt; ничего больше не делает, т.е. не добавляет никакой новой информации, обработчик переходит к следующему условию &lt;triple&gt;
</p><p>На самом деле, приведённое описание работы шаблона не совсем корректно; во всяком случае, для данной программной реализации этого механизма. Начальный узел (seed) на самом деле - это внутренняя переменная, указывающая на контейнер; в данном случае это элемент &lt;vbox&gt;; переменная ?start получает значение атрибута ref позже, но это лишь деталь реализации, ненамного улучшающая понимание механизма работы шаблонов. Поэтому положим пока что, что имеется лишь один возможный результат.
</p><p>После анализа содержимого тэга &lt;content&gt; конструктор переходит к следующему условию, &lt;triple&gt;, которое выглядит примерно так:
</p>
<pre>&lt;triple subject="?start"
        predicate="http://www.xulplanet.com/rdf/relatedItem"
        object="?relateditem"/&gt;
</pre>
<p>Условие &lt;triple&gt; используется для перехода по дугам в графе RDF. Атрибут predicate определяет метку дуги, по которой необходимо перемещаться. В данном случае, он имеет значение '<span class="nowiki">http://www.xulplanet.com/rdf/relatedItem</span>', поэтому конструктор переходит по дугам с этой меткой; он может переходить по направлению, указанному в графе, либо в противоположном направлении, но только в одном направлении для каждого условия. Конструктор сам определяет, в каком направлении необходимо двигаться, в зависимости от того, какие данные известны, а какие нужно найти. Возвращаясь к имеющимся результатам, имеем:
</p>
<pre>(?start = http://www.xulplanet.com/rdf/A)
</pre>
<p>Как вы помните, начальный узел (seed) был определён условием &lt;content&gt;. Как вы уже, наверное, догадываетесь, конструктор подставляет значение этой переменной в атрибут subject, получая:
</p>
<pre>&lt;triple subject="http://www.xulplanet.com/rdf/A"
        predicate="http://www.xulplanet.com/rdf/relatedItem"
        object="?relateditem"/&gt;
</pre>
<p>На самом деле, конструктор не изменяет элемент triple, но такая условность упрощает понимание работы шаблона. Конструктор просматривает содержимое атрибутов subject и object элемента triple и пытается найти все переменные, использующие эти данные. Переменная ?start имеет значение '<span class="nowiki">http://www.xulplanet.com/rdf/A</span>', поэтому её значение подставляется в условие. Переменная ?relateditem не имеет никакого значение, поэтому она будет оставлена как есть. После того, как значения переменных подставлены, можно выполнить запрос к графу RDF.
</p><p>Запрос выявит все дуги, выходящие из вершины '<span class="nowiki">http://www.xulplanet.com/rdf/A</span>' с меткой, соответствующей предикату '<span class="nowiki">http://www.xulplanet.com/rdf/relatedItem</span>'. Поскольку переменная ?relateditem неизвестна, конструктор позволяет в качестве объекта любой узел, и просмотрит в источнике данных все утверждения RDF, удовлетворяющие такому условию. В условии &lt;triple&gt; атрибут subject всегда соответствует узлу, из которого выходит дуга, тогда как атрибуту object соответствует узел, в который дуга входит. В данном случае конструктор будет переходить в стандартном направлении, а не в обратном. Давайте снова посмотрим на наш граф:
</p><p><img alt="Image:Template-guide-p2.png" fileid="2591" src="File:ru/Media_Gallery/Template-guide-p2.png">
</p><p>Начиная с вершины A и следуя по дуге relatedItem, можем видеть, что есть три возможных значения для переменной ?relateditem: узлы B, C и D. Это новые данные, поэтому конструктор добавляет их к графу результатов. Поскольку было найдено три узла, набор возможных (промежуточных) результатов выглядит так:
</p>
<pre>(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/B)
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/C)
(?start = http://www.xulplanet.com/rdf/A, ?relateditem = http://www.xulplanet.com/rdf/D)
</pre>
<p>Вы, должно быть, заметили, что переменная ?start повторяется для каждого результата. Это происходит потому, что конструктор копирует существующие данные для всех промежуточных результатов и добавляет новые данные. Точнее, это не совсем так; конструктор на самом деле использует одну копию результатов, остальные значения - это только ссылки на эту копию.
</p><p>Это может показаться несколько запутанным, но, когда мы перейдём к рассмотрению примеров, это станет более ясным. Поскольку &lt;triple&gt; был последним условием, конструктор переходит к этапу генерации контента, т.е. будет создано три элемента.
</p>{{ languages( { "en": "en/XUL/Template_Guide/RDF_Query_Syntax" } ) }}
Вернуть эту версию