Нужна помощь в понимании того, как SPARQL запрашивает входной файл

Я работаю с SPARQL и не могу понять, как он проходит через входной файл. Например, у меня есть три заказа одного и того же продукта от трех разных предприятий. В моем запросе это работает, когда есть только две покупки для двух компаний, но когда я добавляю треть каждого в, это проходит почти как цикл. Он проверяет одну покупку для первого бизнеса, два для второго и три для третьего. Я запутался, почему это будет делать что-то вроде цикла?

В основном у меня возникают проблемы с пониманием того, как SPARQL ищет входной файл при нажатии кнопки "Пуск".

Пример запроса будет похож

SELECT ?price
WHERE{
      ?test    e:price    ?price;
               e:business ?business.

      ?test2   e:price    ?price2;
               e:business ?business2.
}

1 ответ

Это не что-то уникальное для SPARQL. Если бы вы писали на SQL, вы бы получили то же самое. Ваш запрос запрашивает значение переменной цены для каждого соответствующего экземпляра шаблона. Представьте, что у вас есть три человека и их возраст:

:tom   :age 31 .
:dick  :age 32 .
:harry :age 34 .

Если вы попросите "выбрать человека и персона и дать мне возраст первого", то есть девять способов выбрать двух человек (поскольку вы можете выбрать одного и того же человека дважды), и это означает, что у вас будет девять ответов. Например, если вы запустите запрос вроде:

select ?p1 ?p2 ?age {
  ?p1 :age ?age
  ?p2 :age ?age2
}

p1     p2     age
-----------------
tom    tom    31
tom    dick   31
tom    harry  31
dick   tom    32
dick   dick   32
dick   harry  32
harry  tom    34
harry  dick   34
harry  harry  34

Не совсем понятно, что вы пытаетесь получить, но если вы хотите убедиться, что два экземпляра различны, вы можете добавить фильтр:

select ?p1 ?p2 ?age {
  ?p1 :age ?age
  ?p2 :age ?age2
  filter( ?p1 != ?p2 )
}

p1     p2     age
-----------------
tom    dick   31
tom    harry  31
dick   tom    32
dick   harry  32
harry  tom    34
harry  dick   34

Вы также можете добавить фильтр для наложения порядка на термины, и в этом случае вы можете дополнительно ограничить количество пар, которые вы получаете (только одна на каждые два человека):

select ?p1 ?p2 ?age {
  ?p1 :age ?age
  ?p2 :age ?age2
  filter( ?p1 < ?p2 )
}

p1     p2     age
-----------------
dick   tom    32
dick   harry  32
harry  tom    34

Не зная точно, что вы пытаетесь получить, на самом деле невозможно дать вам что-то большее, чем эти общие рекомендации.

Другие вопросы по тегам