SPARQL многографический запрос и сортировка (Virtuoso 7)

Можно ли легко сделать 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, но вы все равно должны вручную выбрать данные на графике, который вы хотите.

Если кто-то может помочь, это более чем приветствуется.

Спасибо.

1 ответ

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

# Named graph : http://data.books.com/default
@prefix book: <http://data.books.com/resource/Book/>
@prefix ns: <http://data.books.com/ns#>

book:8780953608758 ns:hasSupplier <http://data.books.com/supplier/Alpha> .
book:8780953608758 ns:hasSupplier <http://data.books.com/supplier/Beta> .


# Named graph : http://data.books.com/supplier/Alpha
@prefix book: <http://data.books.com/resource/Book/>
@prefix price: <http://data.books.com/resource/Price/>
@prefix gr: <http://purl.org/goodrelations/v1#>
@prefix dc: <http://purl.org/dc/terms/>

book:8780953608758 gr:hasPriceSpecification price:8780953608758_FR_EUR .
price:8780953608758_FR_EUR gr:hasCurrencyValue "10" .
book:8780953608758 dc:available 1447632000 .

# Named graph : http://data.books.com/supplier/Beta
@prefix book: <http://data.books.com/resource/Book/>
@prefix price: <http://data.books.com/resource/Price/>
@prefix gr: <http://purl.org/goodrelations/v1#>
@prefix dc: <http://purl.org/dc/terms/>

book:8780953608758 gr:hasPriceSpecification price:8780953608758_FR_USD .
price:8780953608758_FR_USD gr:hasCurrencyValue "8" .
book:8780953608758 dc:available 1547632000 .

Первый подзапрос в запросе ниже использует график http://data.books.com/default чтобы найти и отсортировать все графики наших поставщиков для книги 8780953608758. Затем он сопоставляет другой шаблон с этим графиком.

PREFIX book: <http://data.bookeen.com/resource/Book/>

CONSTRUCT 
{
    book:8780953608758 ?p ?o . ?o ?cp ?co .
}
WHERE 
{
    {
        SELECT ?supplier 
        FROM <http://data.books.com/default>
        WHERE 
        {
            VALUES (?supplier ?priority) 
            { 
                (<http://data.books.com/supplier/Beta> 1) 
                (<http://data.books.com/supplier/Alpha> 2)   
            }
            book:8780953608758 <http://data.books.com/ns/hasSupplier> ?supplier.
        }
        ORDER BY ?priority
        LIMIT 1
    }

    GRAPH ?supplier
    {
        book:8780953608758 ?p ?o .
        OPTIONAL { ?o ?cp ?co . }
    }
}
Другие вопросы по тегам