2013-07-11 2 views
12

В SPARQL мы можем сделать что-то вроде этогоВыберите несколько значений в качестве объекта в SPARQL шаблон

select * where { 
    ?s (_:prop1 | _:prop2) "some_val" . 
    ... 
    #use ?s in other patterns 
    ?s ?o ?p . 
} 

Можно ли сделать то же самое для объекта части шаблона? И каковы некоторые обходные пути этого, если это невозможно?

Например:

select * where { 
    ?s _:prop ("v1" | "v2") . 
    ... 
    #use ?s in other patterns 
    ?s ?o ?p . 
} 

ответ

18

Есть несколько способов сделать это. Простейшим и чистым методом SPARQL 1.0 является использование UNION, например.

SELECT * WHERE 
{ 
    { ?s _:prop "v1" } UNION { ?s _:prop "v2" } 

    # Use ?s in other patterns 
} 

Это, вероятно, самый простой способ, но если вам нужно несколько ограничений на ?s это может быстро получить громоздким.

Второй метод заключается в использовании функции IN в предложении FILTER, для этого требуется реализация SPARQL 1.1, например.

SELECT * WHERE 
{ 
    ?s _:prop ?value . 
    FILTER(?value IN ("v1", "v2")) 

    # Use ?s in other patterns 
} 

Проблема здесь в том, что с помощью IN может выполнять очень плохо, если у вас есть много альтернатив или много данных, которые могут быть сопоставлены с помощью ?s _:prop ?value

Третьего метода заключается в использовании пункта VALUES который снова требует SPARQL 1.1 реализация:

SELECT * WHERE 
{ 
    VALUES (?value) { ("v1") ("v2 ") } 
    ?s _:prop ?value . 

    # Use ?s in other patterns 
} 

Это, вероятно, самый лучший вариант, поскольку он масштабируется для многих альтернатив лучше (в зависимости от реализации SPARQL) и, возможно, самый приятный для чтения и записи.

2

Это хорошо работает:

SELECT * 
WHERE 
{ 
    VALUES ?value 
    { 
     "value1" 
     "value2" 
     "etc" 
    } 

    ?s ?p ?value 
} 
Смежные вопросы