GraphQL-LD
On this page
Instead of SPARQL queries, you can also provide GraphQL-LD queries, which are GraphQL queries enhanced with a JSON-LD context. GraphQL-LD is a developer-friendly alternative to SPARQL that allows querying Linked Data and using the results in a straightforward way.
What is GraphQL-LD?
Assuming the following SPARQL query:
SELECT ?id ?starring WHERE { OPTIONAL { ?id <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://dbpedia.org/ontology/Film>; <http://dbpedia.org/ontology/starring> ?starring. ?starring <http://www.w3.org/2000/01/rdf-schema#label> "Brad Pitt"@en. } }
This could be written in a more compact way in GraphQL:
{ id ... on Film { starring(label: "Brad Pitt") } }
And this can be based on the following JSON-LD context:
{ "@context": { "Film": "http://dbpedia.org/ontology/Film", "label": { "@id": "http://www.w3.org/2000/01/rdf-schema#label", "@language": "en" }, "starring": "http://dbpedia.org/ontology/starring" } }
Learn more about the features of GraphQL-LD on GitHub, or read an article about GraphQL-LD.
Using GraphQL-LD on the command line
To run GraphQL queries with Comunica SPARQL from the command line,
set the -i
flag to graphql
and refer to your config file with the JSON-LD context (@context
) through the -c
flag.
To output your results as a GraphQL tree, set the MIME type of the output with -t
to tree
.
For example, the first 100 labels in DBpedia can be retrieved as follows:
$ comunica-sparql http://fragments.dbpedia.org/2015-10/en \ -q "{ label(first: 100) @single }" \ -c "{ \"@context\": { \"label\" : \"http://www.w3.org/2000/01/rdf-schema#label\" } }" \ -i graphql \ -t tree
Since the queries and contexts can be inconvenient to pass on the command line, they can also be supplied as files:
$ comunica-sparql http://fragments.dbpedia.org/2015-10/en \ -f query.graphql \ -c config-with-context.json \ -i graphql \ -t tree
Using GraphQL-LD in an application
If you want to execute GraphQL-LD queries in your application, you can do this as follows:
const QueryEngine = require('@comunica/query-sparql').QueryEngine; const bindingsStreamToGraphQl = require('@comunica/actor-query-result-serialize-tree').bindingsStreamToGraphQl; const myEngine = new QueryEngine(); const result = await myEngine.query(` { label @single writer(label_en: \"Michael Jackson\") @single artist @single { label @single } } `, { sources: ['http://fragments.dbpedia.org/2016-04/en'], queryFormat: { language: 'graphql', version: '1.0' }, "@context": { "label": { "@id": "http://www.w3.org/2000/01/rdf-schema#label" }, "label_en": { "@id": "http://www.w3.org/2000/01/rdf-schema#label", "@language": "en" }, "writer": { "@id": "http://dbpedia.org/ontology/writer" }, "artist": { "@id": "http://dbpedia.org/ontology/musicalArtist" } } }); // Converts raw Comunica results to GraphQL objects const data = await bindingsStreamToGraphQl(await result.execute(), result.context, {materializeRdfJsTerms: true});