SPARQL

**SPARQL** (dibaca "sparkle", merupakan akronim rekursif dari "*SPARQL Protocol and RDF Query Language*") adalah bahasa kueri RDF, yaitu bahasa kueri semantik untuk basis data, yang mampu mengambil dan memanipulasi data yang disimpan dalam format *Resource Description Framework* (RDF). Bahasa ini dijadikan standar oleh *RDF Data Access Working Group* (DAWG) dari Konsorsium World Wide Web (W3C), dan diakui sebagai salah satu teknologi utama dalam *semantic web*. Pada 15 Januari 2008, SPARQL 1.0 diakui oleh W3C sebagai rekomendasi resmi, dan SPARQL 1.1 menyusul pada Maret 2013.

SPARQL memungkinkan suatu kueri terdiri atas pola tripel, konjungsi, disjungsi, dan pola opsional.

Implementasi SPARQL tersedia untuk berbagai bahasa pemrograman. Terdapat pula perkakas bantu yang memungkinkan pengguna terhubung dan membangun kueri SPARQL secara semiotomatis untuk titik akhir SPARQL, contohnya ViziQuer. Selain itu, tersedia alat untuk menerjemahkan kueri SPARQL ke bahasa kueri lain, misalnya ke SQL dan XQuery.

## SPARQL vs SQL
SPARQL dan SQL memiliki fungsi yang mirip, yaitu memungkinkan pengguna untuk mengambil serta memodifikasi data, tetapi keduanya memiliki fokus yang berbeda. SQL digunakan untuk sistem basis data relasional, sedangkan SPARQL dirancang untuk basis data graf NoSQL seperti GraphDB. SPARQL juga dapat digunakan untuk mengakses berbagai sumber data berbasis RDF melalui perangkat lunak perantara, sehingga memungkinkan kueri dilakukan pada basis data non-RDF dengan bantuan teknik pemetaan seperti RDB2RDF. Kemampuan ini memberikan fleksibilitas yang lebih tinggi dibandingkan SQL, terutama dalam hal pengolahan, penyaringan, dan penggabungan data.

Keunggulan utama SPARQL terletak pada kemampuannya menjalankan kueri terfederasi, yang memungkinkan akses ke banyak penyimpanan data secara bersamaan. Hal ini dimungkinkan karena SPARQL berfungsi tidak hanya sebagai bahasa kueri, tetapi juga sebagai protokol transport berbasis HTTP, yang mendukung pengembalian data dalam berbagai format pertukaran. SPARQL dirancang untuk mendukung konsep *[[Data tertaut|Linked Data]]* dalam *Semantic Web*, sehingga memungkinkan data saling terhubung dan dibagikan secara global. Dengan memanfaatkan URI, data dapat dirujuk secara eksplisit di berbagai aplikasi, sehingga memudahkan integrasi dan pemanfaatan lintas sumber dengan biaya pengembangan yang lebih efisien.

## Contoh
Berikut adalah contoh kueri SPARQL yang memodelkan pertanyaan "Apa saja ibu kota negara di Afrika?":


```sparql
PREFIX ex: <http://example.com/exampleOntology#>
SELECT ?capital
       ?country
WHERE
  {
    ?x  ex:cityname       ?capital   ;
        ex:isCapitalOf    ?y         .
    ?y  ex:countryname    ?country   ;
        ex:isInContinent  ex:Africa  .
  }
```


Variabel ditandai dengan awalan `?` atau `$`. Hasil pengikatan untuk `?capital` dan `?country` akan dikembalikan. Ketika sebuah tripel diakhiri dengan titik koma, subjek dari tripel tersebut secara implisit akan digunakan kembali untuk melengkapi pasangan berikutnya menjadi satu tripel utuh. Sebagai contoh, `ex:isCapitalOf ?y` merupakan bentuk singkat dari `?x ex:isCapitalOf ?y`.

Pemroses kueri SPARQL akan mencari himpunan tripel yang cocok dengan empat pola tripel tersebut, dan mengikat variabel dalam kueri ke bagian yang sesuai dari setiap tripel. Hal penting yang perlu dicatat adalah orientasi properti (*property orientation*), di mana pencocokan kelas dapat dilakukan hanya melalui atribut atau properti kelas.

Untuk membuat kueri lebih ringkas, SPARQL memungkinkan pendefinisian awalan (*prefix*) dan URI dasar dengan cara yang mirip seperti dalam sintaks Turtle. Dalam kueri ini, awalan `ex` merujuk pada ``.

SPARQL juga memiliki operasi bawaan untuk tipe data `dateTime`. Berikut adalah kueri yang akan mengembalikan semua perangkat lunak, di mana tanggal akhir masa dukungannya lebih dari atau sama dengan 1000 hari sejak tanggal rilisnya, dan tahun rilisnya adalah 2020 atau lebih baru:


```sparql
SELECT ?lbl ?version ?released ?eol ?duration
WHERE {
    ?software a ex:Software ;
              rdfs:label  ?lbl ;
              ex:EOL  ?eol ;   # is xsd:dateTime
              ex:version ?version ;  # string
              ex:released ?released ; # is xsd:dateTime

    # After this stage,	?duration is bound as xsd:duration type
    # (in Java implementations, org.apache.jena.datatypes.xsd.XSDDuration)
    # and is available in the pipeline,	in the SELECT, and in
    # GROUP or ORDER operators,	etc.:
    BIND(?eol - ?released AS ?duration)

    # toString representation of Duration is of format PnYnMnDTnHnMnS.  
    # We must use ^^ casting to tell the engine this is to be treated as a duration.
    # SPARQL (and RDF) literal syntax has built-in numeric shortcuts to simplify 
    # expressions without casts:
    #   16         xsd:int       java.lang.Integer
    #   16.7       xsd:decimal   java.math.BigDecimal   preserves precision
    #   16.700     xsd:decimal   java.math.BigDecimal   preserves precision
    #   1.0632e6   xsd:double    java.lang.Double   true double float; be careful
    #   2147483649 xsd:long      java.lang.Long  >32 bit int automatically detected
    #
    # Most castings work as expected e.g. "16.700"^^xsd:double.   
    # Note in the FILTER below we use the shortcut for integer 2020:

    FILTER(?duration >= "P1000D"^^xsd:duration && YEAR(?released) >= 2020)
}
ORDER BY DESC(?duration)
LIMIT 5
```


## Lihat pula

* Basis data graf

## Referensi