Describe the shape. Get the data.

Data integration where you just say what you want. Your data lives in different systems — SPOQE lets you query them as one.

Write the shape of the result you need. SPOQE compiles it to native queries, crosses the boundaries, and hands it back — in exactly the shape you asked for.

The query is the shape of the result

Your query describes what the result looks like. SPOQE finds data that fits.

Your query

;; Pull tracks, titles, reviews, and notes
{:pull
  [(tracks-by "Miles Davis")
   :dc/title
   {:dc/creator [:foaf/name]}
   {:review/has [:review/stars
                 :review/text]}
   {:notes/has
     (text-match "modal")}]}
Click to light up the graph

Sources used

Triplestore (SPARQL)
Postgres (SQL)
Elasticsearch
Triplestore (SPARQL) Postgres (SQL) Elasticsearch Miles Davis Blue in Green So What "Blue in Green" "So What" "Miles Davis" reviews track_id stars text 42 5 Haunting 42 4 Timeless 87 4 Classic ... notes match: "modal" 42 ...pioneering modal interchange... 87 ... modal jazz at its purest... :mo/track :mo/track :dc/title :dc/title :dc/creator bridge bridge bridge bridge

How it works

1

Describe

Write the shape of the data you want. Nested maps describe traversals. The query IS the result schema.

2

Compile

SPOQE compiles your shape into native queries — SPARQL for the triplestore, SQL for Postgres. Bridges connect the sources.

3

Fill

Results come back in the exact shape you described. One query, multiple sources, one result. No joins to write.

One query. Three sources. One shape.

SPOQE compiles your query into native instructions for each backend.

{:pull
  [(tracks-by "Miles Davis")
   :dc/title                    ; triplestore
   {:dc/creator [:foaf/name]}  ; triplestore
   {:review/has                  ; Postgres
     [:review/stars
      :review/text]}
   {:notes/has                   ; Elasticsearch
     (text-match "modal")}]}

Triplestore

SELECT ?track ?title ?name
WHERE {
  ?track dc:creator ?artist .
  ?artist foaf:name "Miles Davis" .
  ?track dc:title ?title .
  ?artist foaf:name ?name .
}

Bridge

IRI → track_id

Postgres

SELECT stars, text
FROM reviews
WHERE track_id IN (42, 87)

Bridge

IRI → track_id

Elasticsearch

{"query": {"bool": {"must": [
  {"terms": {"track_id": [42, 87]}},
  {"match": {"notes": "modal"}}
]}}}

Result — the shape you asked for

[{:dc/title     "Blue in Green"
  :dc/creator   {:foaf/name "Miles Davis"}
  :review/has   [{:review/stars 5  :review/text "Haunting"}]
  :notes/has    [{:notes/text "...pioneering modal interchange..."}]}
 {:dc/title     "So What"
  :dc/creator   {:foaf/name "Miles Davis"}
  :review/has   [{:review/stars 4  :review/text "Classic"}]
  :notes/has    [{:notes/text "...modal jazz at its purest..."}]}]

Queries are data.

No hidden magic. No string templates. The query describes the shape. The system fills it. You see everything.