Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

LDflex makes Linked Data in JavaScript fun

LDflex is a domain-specific language for querying Linked Data on the Web as if you were browsing a local JavaScript graph.

npm version Build Status Coverage Status Dependency Status DOI

You can write things like person.friends.firstName to get a list of your friends. Thanks to the power of JSON-LD contexts and JavaScript's Proxy, these properties are not hard-coded in LDflex, but can be chosen at runtime. They feel as if you're traversing a local object, while you're actually querying the Web—without pulling in all data first.

Tim Berners-Lee came up with the idea for such a fluid JavaScript interface to Linked Data, in a discussion on how to make Linked Data easier for developers.

Articles and tutorials


npm install ldflex

In order to execute queries, you will also need a query engine:

npm install @ldflex/comunica


When you have obtained a starting subject, you can navigate through its properties using standard JavaScript dot property syntax.

In order to query for the result, use await if you want a single value, or for await to iterate over all values.


const { PathFactory } = require('ldflex');
const { default: ComunicaEngine } = require('@ldflex/comunica');
const { namedNode } = require('@rdfjs/data-model');

// The JSON-LD context for resolving properties
const context = {
  "@context": {
    "@vocab": "",
    "friends": "knows",
    "label": "",
// The query engine and its source
const queryEngine = new ComunicaEngine('');
// The object that can create new paths
const path = new PathFactory({ context, queryEngine });

Looking up data on the Web

const ruben = path.create({ subject: namedNode('') });

async function showPerson(person) {
  console.log(`This person is ${await}`);

  console.log(`${await person.givenName} is interested in:`);
  for await (const name of person.interest.label)
    console.log(`- ${name}`);

  console.log(`${await person.givenName} is friends with:`);
  for await (const name of person.friends.givenName)
    console.log(`- ${name}`);

Inspecting the generated path expression

(async person => {
  console.log(await person.friends.givenName.pathExpression);

Getting all subjects of a document

(async document => {
  for await (const subject of document.subjects)

Getting all properties of a subject

(async subject => {
  for await (const property of

Converting an LDflex expression into a SPARQL query

(async person => {
  console.log(await person.friends.givenName.sparql);

Sorting path results

(async person => {
  for await (const uri of person.interest.sort('label'))
    console.log(`- ${uri}`);

The sort function takes multiple arguments, creating a path that sorts on the last argument. The path can also continue after the sort: person.friends.sort('country', 'label').givenName will sort the friends based on the label of their country, and then return their names.

Additional Handlers

The following libraries provide handlers that extend the functionality of LDflex:

  • async-iteration-handlers Provides methods such as .map, .filter and .reduce for the async-iterable results returned by LDflex.


©2018–present Ruben Verborgh, Ruben Taelman. MIT License.