Можно ли легко сделать запрос CONSTRUCT
, где я мог бы проверять данные на разных графиках и сортировать их по «предпочтению графика»?
Допустим, я продаю продукты. Для каждого продукта у меня могут быть разные поставщики, так что моя установка будет выглядеть так:
<http://data.experiment.com/product/1> <http://purl.org/goodrelations/v1#hasCurrencyValue> "10" <http://data.experiment.com/graph/supplier/1> .
<http://data.experiment.com/product/1> <http://purl.org/goodrelations/v1#hasCurrencyValue> "8" <http://data.experiment.com/graph/supplier/2> .
<http://data.experiment.com/product/2> <http://purl.org/goodrelations/v1#hasCurrencyValue> "5" <http://data.experiment.com/graph/supplier/2> .
Для каждой спецификации продукта я хочу получить ее из <http://data.experiment.com/graph/supplier/1>
, а затем из <http://data.experiment.com/graph/supplier/2>
, если она не найдена в <http://data.experiment.com/graph/supplier/1>
.
Вот что я придумал:
CONSTRUCT
{
<http://data.experiment.com/product/1> ?p ?o .
}
WHERE
{
GRAPH <http://data.experiment.com/graph/supplier/1>
{
OPTIONAL
{
<http://data.experiment.com/product/1> ?p1 ?o1 .
}
}
GRAPH <http://data.experiment.com/graph/supplier/2>
{
OPTIONAL
{
<http://data.experiment.com/product/1> ?p2 ?o2 .
}
}
BIND (IF (BOUND(?p1), ?p1, IF (BOUND(?p2), ?p2, UNDEF)) AS ?p)
BIND (IF (BOUND(?o1), ?o1, IF (BOUND(?o2), ?o2, UNDEF)) AS ?o)
}
Это работает очень хорошо, если я знаю, что я ищу. Теперь, если я рассмотрю:
CONSTRUCT
{
<http://data.experiment.com/product/1> ?p ?o . ?o ?cp ?co
}
WHERE
{
GRAPH <http://data.experiment.com/graph/supplier/1>
{
OPTIONAL
{
<http://data.experiment.com/product/1> ?p1 ?o1 .
OPTIONAL { ?o1 ?cp1 ?co1 . }
}
}
GRAPH <http://data.experiment.com/graph/supplier/2>
{
OPTIONAL
{
<http://data.experiment.com/product/1> ?p2 ?o2 .
OPTIONAL { ?o2 ?cp2 ?co2 . }
}
}
BIND (IF (BOUND(?p1), ?p1,IF (BOUND(?p2), ?p2, UNDEF)) AS ?p)
BIND (IF (BOUND(?o1), ?o1,IF (BOUND(?o2), ?o2, UNDEF)) AS ?o)
BIND (IF (BOUND(?cp1), ?cp1,IF (BOUND(?cp2), ?cp2, UNDEF)) AS ?cp)
BIND (IF (BOUND(?co1), ?co1,IF (BOUND(?co2), ?co2, UNDEF)) AS ?co)
}
Иногда это не работает, потому что я явно BIND
?o
, а ?o
может не быть Объектом —
Virtuoso RDF01 Ошибка Неверное значение переменной в CONSTRUCT: «1532610063» (тег 189 флагов поля 0) не является допустимым субъектом, только объект тройки может быть литералом
Кажется, я не нахожу никого, кто пытается сортировать данные по «графикам», и я изо всех сил пытаюсь найти «простой» способ сделать это. Я пробовал с SELECT
и FROM NAMED
, но вам все равно придется вручную выбирать данные из графика, который вы хотите.
Если кто-то может помочь, это более чем приветствуется.
Спасибо.
OPTIONAL
, которые представляют собой левые внешние соединения с пустыми таблицами в вашем запросе. - person UninformedUser   schedule 27.07.2018COALESCE
для своих сложныхBIND ... IF
предложений. Я нашел хороший пример. - person TallTed   schedule 30.07.2018<data/product/1>
,<graph:supplier2>
), которые делают их непригодными для запуска каких-либо живых тестов. При размещении вопросов здесь полезно использовать Turtle, N-Triples и/или N-Quads для данных и SPARQL для запросов. - person TallTed   schedule 30.07.2018