sparql-mode icon indicating copy to clipboard operation
sparql-mode copied to clipboard

A SPARQL mode for emacs

  • What is it? A major mode for emacs that provides syntax highlighting for [[http://www.w3.org/TR/sparql11-query/][SPARQL]]. It also provides a way to execute queries against a SPARQL HTTP endpoint, such as is provided by [[http://jena.apache.org/documentation/serving_data/][Fuseki]]. It is also possible to query other endpoints like [[http://dbpedia.org/sparql][DBPedia]].

  • Getting Started [[https://melpa.org/#/sparql-mode][file:https://melpa.org/packages/sparql-mode-badge.svg]] [[https://stable.melpa.org/#/sparql-mode][file:https://stable.melpa.org/packages/sparql-mode-badge.svg]]

    • Download sparql-mode and put it in a directory somewhere.
    • Add the following to your .emacs file

    #+BEGIN_SRC emacs-lisp (add-to-list 'load-path "/path/to/sparql-mode-dir") (autoload 'sparql-mode "sparql-mode.el" "Major mode for editing SPARQL files" t) (add-to-list 'auto-mode-alist '("\.sparql$" . sparql-mode)) (add-to-list 'auto-mode-alist '("\.rq$" . sparql-mode)) #+END_SRC

    Now sparql-mode will load whenever you visit a file whose name ends with .sparql. Alternatively, run =M-x sparql-mode= in an existing buffer containing SPARQL commands.

    It is also possible to add #+BEGIN_SRC emacs-lisp -- mode: sparql -- #+END_SRC to the top of the file. This is a comment read by emacs to discover what mode to use.

** Auto complete SPARQL-mode has basic support for both =auto-complete-mode= and =company-mode=. Just add your favourite completion mode to =sparql-mode-hook=.

#+BEGIN_SRC emacs-lisp (add-hook 'sparql-mode-hook 'your-favourite-completion-mode) #+END_SRC

  • Executing SPARQL Queries from within Emacs From a buffer that is in sparql-mode, execute =M-x sparql-query-region=. You will be prompted for a SPARQL HTTP endpoint in the minibuffer, which defaults to =http://localhost:2020/=. Once set, it will be used for all subsequent queries in that buffer. Results will be displayed in another buffer in CSV format.

  • Org-babel support It is also possible to use =sparql-mode= with org-mode and executing queries with org-babel. You can do that by adding the following snippet or adding =(sparql . t)= to languages org-babel can load:

    #+BEGIN_SRC emacs-lisp (org-babel-do-load-languages 'org-babel-load-languages '((sparql . t))) #+END_SRC

    You can then execute the query by pressing =C-c C-c= on the source-block header.

    By default results formatted as =text/csv= will be converted to an org table. This can be disabled by adding =:results scalar= to the header. See examples.

*** Example Default behaviour for results in csv is to convert the result to a table:

#+BEGIN_SRC org
  ,#+BEGIN_SRC sparql :url https://live.dbpedia.org/sparql :format text/csv
    SELECT DISTINCT ?Concept WHERE {
      [] a ?Concept
    } LIMIT 5
  ,#+END_SRC

  ,#+RESULTS:
  | Concept                                                          |
  |------------------------------------------------------------------|
  | http://www.openlinksw.com/schemas/virtrdf#QuadMapFormat          |
  | http://www.openlinksw.com/schemas/virtrdf#QuadStorage            |
  | http://www.openlinksw.com/schemas/virtrdf#array-of-QuadMapFormat |
  | http://www.openlinksw.com/schemas/virtrdf#QuadMap                |
  | http://www.openlinksw.com/schemas/virtrdf#QuadMapValue           |
#+END_SRC

If you don't want to convert the result to a table, you can
override that behaviour by specifying that the result should be
=scalar=:

#+BEGIN_SRC org
  ,#+HEADER: :url https://live.dbpedia.org/sparql
  ,#+HEADER: :format text/csv
  ,#+HEADER: :results scalar
  ,#+BEGIN_SRC sparql
    SELECT DISTINCT ?Concept WHERE {
      [] a ?Concept
    } LIMIT 5
  ,#+END_SRC

  ,#+RESULTS:
  : "Concept"
  : "http://www.openlinksw.com/schemas/virtrdf#QuadMapFormat"
  : "http://www.openlinksw.com/schemas/virtrdf#QuadStorage"
  : "http://www.openlinksw.com/schemas/virtrdf#array-of-QuadMapFormat"
  : "http://www.openlinksw.com/schemas/virtrdf#QuadMap"
  : "http://www.openlinksw.com/schemas/virtrdf#QuadMapValue"
#+END_SRC

We can also declare variables that will then be expanded before
execution. For example the following query:

#+BEGIN_SRC sparql :var x="friend:Julia"
  SELECT * WHERE {
    ?x foaf:name ?name.
    $x foaf:email ?email.
  }
#+END_SRC

will be transformed into the following before it is executed:

#+BEGIN_SRC sparql
  SELECT * WHERE {
    friend:Julia foaf:name ?name.
    friend:Julia foaf:email ?email.
  }
#+END_SRC

Notice that =$x= and =?x= are treated as identical. This is
because SPARQL treats them as identical.

By combining this with the =#+call= syntax we can create and reuse
queries:

#+BEGIN_SRC org
  ,#+NAME: count-statements-in-graph
  ,#+BEGIN_SRC sparql :var graph="<>"
    SELECT (COUNT(*) AS ?count) WHERE {
      GRAPH $graph {
        ?s ?p ?o .
      }
    }
  ,#+END_SRC

  ,#+CALL: count-statements-in-graph("<http://example.com/my-graph>")

  ,#+RESULTS:
  | count |
  |-------|
  |  1001 |


  ,#+CALL: count-statements-in-graph("<http://example.com/my-other-graph>")

  ,#+RESULTS:
  | count |
  |-------|
  |   100 |

#+END_SRC

Notice that the server request is done synchronously and will
therefore lock the editor if the request takes a long time.
  • Bugs and Enhancements If you have a problem or would like to see it get better in a specific way, feel free to drop an issue in [[https://github.com/ljos/sparql-mode/issues][the issue tracker]]. Enjoy!