2016-07-17 6 views
3

Пусть говорят, что я троек видаSPARQL запрос для получения экземпляров только некоторые, а не все свойства

uri:ObjA1 uri:propAA uri:Obj1A . 
uri:ObjA1 uri:propAA uri:Obj1B . 

uri:ObjA2 uri:propAA uri:Obj1A . 
uri:ObjA2 uri:propAA uri:Obj1B . 
uri:ObjA2 uri:propAA uri:Obj1C . 

Теперь, что я пытаюсь сделать, это найти все экземпляры, которые имеют только значения Obj1A и Obj1B для propAA. В принципе, запрос должен возвращать ObjA1, а не ObjA2, потому что только ObjA1 принимает значения Obj1A и Obj1B только для propAA. Что у меня сейчас есть

SELECT * where { 
    ?sub uri:propAA uri:Obj1A . 
    ?sub uri:propAA uri:Obj1B . 
    FILTER NOT EXISTS { 
     ?sub uri:propAA ?obj . 
     FILTER((?obj != uri:Obj1A) && (?obj != uri:Obj1B)) . 
    } 
} 

Теперь этот запрос работает. Если я не поставлю условие FILTER NOT EXISTS, он возвращает оба ObjA1 и ObjA2. Теперь я ищу, чтобы узнать, есть ли лучший способ написать этот запрос? Лучше будет означать, более эффективный или более краткий (или оба).

ответ

0

Изложенные в терминах тройных моделей, которые вы ищете решение для ?sub где значения uri:propAA являются как uri:Obj1A и uri:Obj1B. Это основное соединение в SPARQL:

SELECT * 
WHERE { 
    ?sub uri:propAA uri:Obj1A . 
    ?sub uri:propAA uri:Obj1B . 
} 
+0

Я пробовал этот запрос, но он не работает. Он не игнорирует те экземпляры, которые имеют другие значения для propAA, кроме Obj1A и Obj1B. Я ищу только те экземпляры, которые имеют Obj1A и Obj1B как значения для propAA. Ничего более или менее не нужно возвращать. В примере, который я дал, ObjA2 не следует возвращать, потому что помимо Obj1A и Obj1B в качестве значений для propAA он также имеет Obj1C как значение для propAA. – thisisshantzz

+0

В этом случае, я думаю, что у вас все в порядке. – scotthenninger

0

Вы могли бы сократить вещи немного с помощью оператора NOT IN, а также с помощью разъема ,, чтобы избежать повторения тройной схеме:

SELECT * where { 
    ?sub uri:propAA uri:Obj1A, uri:Obj1B . 
    FILTER NOT EXISTS { 
     ?sub uri:propAA ?obj . 
     FILTER(?obj NOT IN (uri:Obj1A, uri:Obj1B)) 
    } 
} 

я сомневаюсь, либо изменение сделает разница, производительность, но она более кратким, а также (IMHO) немного легче читать.

FWIW, двойное отрицание здесь является классическим способом перезаписи универсальной количественной оценки. В конце концов, логично, ∀x P(x) равно ∄x ¬P(x). Поскольку у SPARQL нет оператора FORALL, вам нужно сделать это с NOT EXISTS и двойным отрицанием.

 Смежные вопросы

  • Нет связанных вопросов^_^