2011-08-17 25 views
20

tôi cần một chút giúp đỡ chọn bộ ba ngay từ cửa hàng của tôi ....chọn sử dụng SPARQL dựa trên 'ba không tồn tại'

<a> a <type/1> . 
<b> a <type/1> . 
<c> a <type/1> . 
<c> a <type/2> . 

tôi muốn chỉ chọn các yếu tố đó là loại/1 và không type/2

Cách tốt nhất để đạt được điều này bằng cách sử dụng truy vấn chọn sparql là gì?

đang tìm kiếm omething như:

select ?a where 
{ 
    ?a a <type/1> . 
    !{ ?a a <type/2> } 
} 

Cảm ơn,

:)

Trả lời

23

Một thay thế SPARQL 1.1 giải pháp là sử dụng MINUS ví dụ

SELECT ?a 
WHERE 
{ 
    ?a a <type/1> . 
    MINUS { ?a a <type/2> . } 
} 

MINUS trừ các giải pháp khớp với mẫu ba của nó từ các kết quả phù hợp hiện có.

Trong hầu hết các trường hợp sử dụng FILTER NOT EXISTS { }MINUS { } tương đương nhưng hãy cẩn thận có một số trường hợp góc không đúng - xem SPARQL 1.1 specification để biết một số ví dụ về điều này.

12

Trong SPARQL 1.0 đó là một chút khôn lanh:

SELECT ?a WHERE { 
    ?a a <type/1>. 
    OPTIONAL { 
     ?a a ?othertype . 
     FILTER (?othertype = <type/2>) 
    } 
    FILTER (!BOUND(?othertype)) 
} 

Mệnh OPTIONAL liên kết ?othertype cho bất kỳ ?a nào có <type/2>, và để nó không bị ràng buộc cho bất kỳ ?a mà không có nó.

Cuối cùng FILTER sau đó chỉ chọn những hàng mà ?a không được gắn kết.

Trong SPARQL 1.1 nó dễ dàng hơn nhiều:

SELECT ?a WHERE { 
    ?a a <type/1>. 
    FILTER NOT EXISTS { ?a a <type/2> . } 
} 
+0

Changed SPARQL của bạn 1.1 ví dụ để sử dụng rõ ràng URI trong 'NOT EXISTS' như sử dụng một biến cũng sẽ phù hợp với '' gấp ba mô hình đầu tiên phát hiện và kết quả là lọc ra tất cả các giải pháp – RobV

+0

Cám ơn RobV điều đó! – cygri

Các vấn đề liên quan