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

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

Спасибо.


person ThomasBKN    schedule 27.07.2018    source источник
comment
вы можете связать его один раз для нелитералов и один раз для литералов. оба могут быть объединены через UNION.   -  person UninformedUser    schedule 27.07.2018
comment
кстати, вам следует исправить эту фразу: проверить данные в разных графиках и отсортировать их по графу perefence ?   -  person UninformedUser    schedule 27.07.2018
comment
Я также удивлен, что ваш запрос работает даже иногда. у вас есть только шаблоны OPTIONAL, которые представляют собой левые внешние соединения с пустыми таблицами в вашем запросе.   -  person UninformedUser    schedule 27.07.2018
comment
Спасибо за ваш ответ @AKSW. Я не думаю, что смогу достичь того, что мне нужно, с профсоюзом. Я попробую по-другому.   -  person ThomasBKN    schedule 30.07.2018
comment
Вы можете использовать COALESCE для своих сложных BIND ... IF предложений. Я нашел хороший пример.   -  person TallTed    schedule 30.07.2018
comment
В ваших примерах данных и запросов есть много проблем (например, <data/product/1>, <graph:supplier2>), которые делают их непригодными для запуска каких-либо живых тестов. При размещении вопросов здесь полезно использовать Turtle, N-Triples и/или N-Quads для данных и SPARQL для запросов.   -  person TallTed    schedule 30.07.2018


Ответы (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 . }
    }
}
person ThomasBKN    schedule 02.08.2018