RDF Literal trong câu truy vấn SPARQL là một chuỗi, cĩ thể cĩ thẻ ngơn ngữ hoặc kiểu dữ liệu. Cĩ vài dạng tiện ích cho kiểu dữ liệu dạng số học là xsd:integer, xsd:decimal, xsd:double và xsd:boolean.
Ví dụ một vài dạng literal trong cú pháp của SPARQL:
• "chat"
• "Việt Nam"@vicĩ thẻ ngơn ngữ “vi”
• "xyz"^^<http://example.org/ns/userDatatype>
• "abc"^^appNS:appDataType
• 1, tương đương với"1"^^xsd:integer
• 1.3, tương đương với"1.3"^^xsd:decimal
• 1.0e6, tương đương với"1.0e6"^^xsd:double
• true, tương đương với"true"^^xsd:boolean
HU
TE
CH
Dữ liệu dưới đây chứa một số các RDF literal theo định dạng N3, sử dụng định dạng N3 ngắn gọn hơn và dễ đọc hơn so với định dạng RDF/XML.
@prefix dt: <http://example.org/datatype#> . @prefix ns: <http://example.org/ns#> . @prefix : <http://example.org/ns#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :x ns:p "42"^^xsd:integer . :y ns:p "abc"^^dt:specialDatatype . :z ns:p "cat"@en .
Dữ liệu này được dùng cho các ví dụ đưới.
Đối sánh số nguyên
Câu truy vấn lấy các chủ thể tham gia triple cĩ thành phần thứ ba là số 42
SELECT ?v WHERE { ?v ?p 42 }
Các kết quả trả về của truy vấn gọi là các giải pháp (solution). Kết quả cĩ một giải pháp :x bởi vì 42 là tương ứng với
"42"^^<http://www.w3.org/2001/XMLSchema#integer>.
Tương tự ta cĩ thể viết một cách tường minh chỉ rõ kiểu dữ liệu. Câu truy vấn dưới đây cĩ một giải pháp của biến v là :y. Trình xử lý truy vấn chỉ kiểm tra bằng nhau giữa giá trị và biến.
SELECT ?v WHERE { ?v ?p "abc"^^<http://example.org/datatype#specialDatatype> }
Đối sánh thẻ ngơn ngữ
Câu truy vấn cĩ dùng thẻ ngơn ngữ sẽ tìm thấy một giải pháp của biến x là :z :
SELECT ?x WHERE { ?x ?p "cat"@en }
Tuy nhiên, nếu bỏ thẻ ngơn ngữ trong câu truy vấn sẽ khơng tìm thấy một giải pháp nào vì literal bằng nhau khi cĩ cùng ngơn ngữ.
HU
TE
CH
Các mẫu triple trong nhĩm Optional sẽ khơng nhất thiết phải đối sánh. Nhĩm Optional bắt đầu bằng từ khĩa OPTIONAL:
pattern OPTIONAL { pattern }
Ví dụ cho dữ liệu:
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . _:a rdf:type foaf:Person .
_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@example.com> . _:a foaf:mbox <mailto:alice@work.example> . _:b rdf:type foaf:Person .
_:b foaf:name "Bob" .
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox
WHERE { ?x foaf:name ?name .
OPTIONAL { ?x foaf:mbox ?mbox } }
Với dữ liệu như trên thì kết quả truy vấn như sau:
name mbox
"Alice" <mailto:alice@example.com> "Alice" <mailto:alice@work.example> "Bob"
Trong giải pháp cuối biến name cĩ giá trị “Bob”, biến mbox khơng cĩ dữ liệu, vì trong dữ liệu khơng cĩ phát biểu mbox nào gán với chủ thể “Bob”.
Truy vấn này tìm tên của những người trong dữ liệu. Nếu cĩ một triple của thuộc tính mbox và cĩ cùng chủ thể thì sẽ cĩ 2 giải pháp cho mỗi phát biểu nên kết quả truy vấn cĩ 2 giải pháp cĩ biến name cùng giá trị “Alice”.
RDF Dataset
A truy vấn SPARQL tìm kiếm trong RDF Dataset . RDF Dataset là tập hợp các đồ thị. Khi truy vấn một tập hợp các đồ thị, từ khĩa GRAPH được dùng để đối sánh các mẫu
HU
TE
CH
trong các đồ thị được đặt tên. Việc chọn đồ thị cĩ thể thơng qua IRI hoặc dùng một biến.
Ví dụ cho hai đồ thị, ký tự (#) đứng đầu dịng cho biết dịng đĩ là dịng chú thích:
# http://example.org/foaf/aliceFoaf
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . _:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> . _:a foaf:knows _:b . _:b foaf:name "Bob" . _:b foaf:mbox <mailto:bob@work.example> . _:b foaf:nick "Bobby" . _:b rdfs:seeAlso <http://example.org/foaf/bobFoaf> . <http://example.org/foaf/bobFoaf> rdf:type foaf:PersonalProfileDocument . # http://example.org/foaf/bobFoaf
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . _:z foaf:mbox <mailto:bob@work.example> . _:z rdfs:seeAlso <http://example.org/foaf/bobFoaf> . _:z foaf:nick "Robert" . <http://example.org/foaf/bobFoaf> rdf:type foaf:PersonalProfileDocument .
Giới hạn phạm vi của biến
Một biến được dùng trong mệnh đề GRAPH cũng cĩ thể được dùng trong mệnh đề GRAPH khác hoặc trong đồ thị mặc định trong dataset.
Giả sử câu truy vấn là tìm email, biệt danh, tên đồ thị mơ tả lý lịch của người đĩ mà chủ nhân của email alice@work.example quen biết.
HU
TE
CH
Truy vấn bên dưới dùng đồ thị cĩ IRI là http://example.org/foaf/aliceFoaf đề tìm kiếm lý lịch của Bob. Mẫu trong mệnh đề GRAPH thứ hai tìm nút rỗng (biến w) của người cĩ tên trong hộp thư (biến mbox) mã đã tìm ở trong mệnh đề GRAPH đầu tiên (biến whom).
PREFIX data: <http://example.org/foaf/> PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?mbox ?nick ?ppd
WHERE {
GRAPH data:aliceFoaf {
?alice foaf:mbox <mailto:alice@work.example> ; foaf:knows ?whom .
?whom foaf:mbox ?mbox ; rdfs:seeAlso ?ppd . ?ppd a foaf:PersonalProfileDocument . } . GRAPH ?ppd { ?w foaf:mbox ?mbox ; foaf:nick ?nick } } Kết quả truy vấn mbox Nick Ppd
<mailto:bob@work.example> "Robert" <http://example.org/foaf/bobFoaf>
Kết hợp FROM và FROM NAMED
Mệnh đề FROM và FROM NAMED cĩ thể dùng trong cùng một câu truy vấn. FROM
NAMED dùng để chỉ định phạm vi là các đồ thị.
# Đồ thị mặc định (lưu ở http://example.org/dft.ttl) @prefix dc: <http://purl.org/dc/elements/1.1/> .
<http://example.org/bob> dc:publisher "Bob Hacker" . <http://example.org/alice> dc:publisher "Alice Hacker" . # Đồ thị cĩ tên: http://example.org/bob
HU
TE
CH
_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:bob@oldcorp.example.org> . # Đồ thị cĩ tên: http://example.org/alice
@prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example.org> .
PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?who ?g ?mbox
FROM <http://example.org/dft.ttl> FROM NAMED <http://example.org/alice> FROM NAMED <http://example.org/bob> WHERE
{
?g dc:publisher ?who .
GRAPH ?g { ?x foaf:mbox ?mbox } }
Who G mbox
"Bob Hacker" <http://example.org/bob> <mailto:bob@oldcorp.example.org> "Alice Hacker" <http://example.org/alice> <mailto:alice@work.example.org>
Câu truy vấn này tìm mbox cùng với những thơng tin trong đồ thị mặc định.
<http://example.org/dft.ttl>.
DISTINCT
Từ khĩa DISTINCT bảo đảm mọi tổ hợp biến trong các giải pháp là duy nhất.
@prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@org> . _:z foaf:name "Alice" .
_:z foaf:mbox <mailto:smith@work> . PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?name WHERE { ?x foaf:name ?name } Name
"Alice"
ORDER BY
Mệnh đề ORDER BY để sắp xếp các giải pháp theo điều kiện. Điều kiện sắp xếp cĩ thể là một biến hoặc một lời gọi hàm. Thứ tự tăng là mặc định. Cĩ thể đặt lệnh sắp xếp
HU
TE
CH
tường minh hơn bằng cách đặt các điều kiện vào trong hàm ASC() hoặc DESC(). Nếu cĩ nhiều điều kiện thì sẽ sắp xếp lần lượt theo các điều kiện.
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name
WHERE { ?x foaf:name ?name } ORDER BY ?name
PREFIX : <http://example.org/ns#> PREFIX foaf: http://xmlns.com/foaf/0.1/
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp } ORDER BY DESC(?emp)
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp } ORDER BY ?name DESC(?emp)
Nếu các biến tham gia làm điều kiện sắp xếp mà khơng cĩ trong mệnh đề SELECT sẽ bị bỏ qua.
LIMIT
LIMIT dùng để giới hạn số lượng giải pháp trả về. Nếu số lượng giải pháp lớn hơn con
số giới hạn thì số lượng giải pháp được giới hạn sẽ trả về.
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name
WHERE { ?x foaf:name ?name } LIMIT 20
OFFSET
OFFSET sẽ lấy các đoạn giải pháp từ vị trí chỉ định bắt đầu.
Để lấy các tập con trong các kết quả trả về thì dùng LIMIT và OFFSET để chọn các tập con khác nhau.
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name
HU
TE
CH
WHERE { ?x foaf:name ?name } ORDER BY ?name
LIMIT 5 OFFSET 10
Câu hỏi đúng hoặc sai
Các ứng dụng cĩ thể dùng dạng ASK để kiểm tra một truy vấn cĩ giải pháp hay khơng. Thơng tin trả về chỉ là true hoặc false.
@prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name "Alice" .
_:a foaf:homepage <http://work.example.org/alice/> . _:b foaf:name "Bob" .
_:b foaf:mbox <mailto:bob@work.example> . PREFIX foaf: <http://xmlns.com/foaf/0.1/> ASK { ?x foaf:name "Alice" }
Kết quả lả yes
FILTER
Filter dùng để ràng buộc giá trị
PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX app: <http://example.org/ns#>
SELECT * WHERE { GRAPH ?g { ?s ?p ?o } . { ?g dc:publisher <http://www.w3.org/> } . { ?g dc:date ?date } .
FILTER ( app:customDate(?date) > "2005-02-28T00:00:00Z"^^xsd:dateTime ) . }
Câu truy vấn trên cĩ ràng buộc ngày với app:customDate là định danh của hàm ngồi trả về định dạng dữ liệu kiểu xsd:dateTime.