Нужна помощь в понимании того, как 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
Не зная точно, что вы пытаетесь получить, на самом деле невозможно дать вам что-то большее, чем эти общие рекомендации.