2013-04-15 23 views

Trả lời

10

Bạn có thể sử dụng UNION ví dụ:

PREFIX prefix: <http://example.org/ns#> 
SELECT * 
WHERE { 
    { ?x a prefix:type1 } UNION { ?x a prefix:type2 } 
} 

Lưu ý việc sử dụng a mà là một từ khóa SPARQL có thể được sử dụng ở vị trí vị và tương ứng với các loại RDF URI http://www.w3.org/1999/02/22-rdf-syntax-ns#type

Có nhiều cách khác để làm điều này như sử dụng FILTER khoản với biểu thức khác nhau:

  • loạt các ?type = prefix:type1 kết hợp với các điều kiện hoặc điều hành ||
  • ?type IN (prefix:type1, prefix:type2)

Hoặc bạn có thể sử dụng một điều khoản VALUES để xác định các tùy chọn cho ?type

Đây có thể là tốt hơn nếu truy vấn của bạn là phức tạp hơn và bạn không muốn lặp lại nhiều truy vấn vào cả hai bên của số UNION hoặc có nhiều hơn hai khả năng đó để xem xét.

+0

"loại? In" xuất hiện thú vị, nhưng nó không hoạt động, tôi chắc chắn đang mắc lỗi về cú pháp, đúng không? CHỌN * WHERE { ? X rdf: gõ? Loại ? Gõ (wo: Kingdom, wo: Phylum) } – Noor

+2

Đây là những biểu thức có thể được sử dụng trong mệnh đề 'FILTER' để nó sẽ là' FILTER (? gõ IN (wo: Kingdon, wo: Phylum)) ' – RobV

9

Nhanh hơn nhiều so với chức năng FILTER IN là việc sử dụng BINDINGS. Tôi rất muốn khuyên bạn nên sử dụng một cái gì đó dọc theo dòng của truy vấn sau chứ không phải là FILTER(?type IN (wo:Kingdon, wo:Phylum).

SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)} 

Sử dụng BINDINGS cho phép động cơ SPARQL để giới hạn kết quả vì nó đang được xử lý chứ không phải trả lại tất cả kết quả trước khi lọc chúng. Điều này làm cho việc trả lại kết quả nhanh hơn nhiều.

+4

Nó không phải là BINDINGS nữa; đó là GIÁ TRỊ. Cách tiếp cận này là đẹp hơn so với một bằng cách sử dụng UNION, mặc dù, và đẹp hơn bằng cách sử dụng FILTER (? Loại IN ...). –

2

Bạn có thể làm điều đó bằng cách sử dụng cú pháp LỌC, như thế này:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX prefix: <http://example.org/ns#> 

SELECT ?s ?p ?o ?type 
WHERE { 
    ?s a ?type . 
    ?s ?p ?o . 
    FILTER(?type IN (prefix:Type1, prefix:Type2)) 
} 

Xin lưu ý rằng tôi không thể đảm bảo hiệu quả, như tôi không biết nếu việc lọc sẽ được áp dụng sau khi tất cả các kết quả sẽ được trả lại hoặc không phải.

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