@shexjs/loader
TypeScript icon, indicating that this package has built-in type declarations

1.0.0-alpha.28 • Public • Published

NPM Version ShapeExpressions Gitter chat https://gitter.im/shapeExpressions/Lobby DOI

@shexjs/loader

Introduction

This module provides HTTP access functions for @shexjs library. For file: access or dynamic loading of ShEx extensions, use @shexjs/node.

Installation

Node.js + npm

npm install @shexjs/loader
const ShExIo = require('@shexjs/loader');

Used with @shexjs suite:

core functions

parse and write ShExC

exectuables

  • @shexjs/cli - command line interface for validation and format conversion
  • @shexjs/webapp - webpacks and the shex-simple interface

validation

extensions

ShapePath

Methods

load(schema, data, schemaOptions = {}, dataOptions = {})

load shex and json files into a single ShEx schema and data into a graph.

SOURCE may be

  • URL - where to load item.
  • object: {text: string, url: string} - text and URL of already-loaded resource.
  • (schema) ShExJ object
  • (data) RdfJs data store

parameters:

  • schema - { shexc: [ShExC SOURCE], json: [JSON SOURCE] }
  • data - { turtle: [Turtle SOURCE], jsonld: [JSON-LD SOURCE] }
  • schemaOptions
  • dataOptions

returns: {Promise<{schema: any, dataMeta: [], data: (|null), schemaMeta: *[]}>}

example:

const N3 = require('n3'); // used for graph API example

// Initialize @shexjs/loader with implementations of APIs.
const ShExLoader = require("@shexjs/loader")({
  rdfjs: N3,                    // use N3 as an RdfJs implementation
  fetch: require('node-fetch'), // fetch implementation
  jsonld: require('jsonld')     // JSON-LD (if you need it)
});

// Schemas from URL, text and ShExJ:
const schemaFromUrl =
      "https://shex.io/webapps/packages/shex-cli/test/cli/1dotOr2dot.shex";

const schemaAsText = {          // ShExC schema and its location
  url: "http://a.example/schemaAsText",
  text: `
<#ShapeFromText> {
  <#p1> @<S1> # reference to Shape loaded from URL
}`
};

const schemaAsShExJ = {
  url: "http://a.example/ShExJ",
  schema: {
    type: "Schema",             // simple schema with single NodeConstraint
    shapes: [
      { "type": "ShapeDecl",
        "id": "http://a.example/S1", // overwrite S1 with NodeConstraint
        "shapeExpr": {
          "type": "NodeConstraint",
          "nodeKind": "iri",
          "pattern": "^https?:" } }
    ] }
};


// Data graphs from URL, text and graph API:
const graphFromUrl =
      "https://shex.io/webapps/packages/shex-cli/test/cli/p1.ttl";

const graphAsText = {          // RDF graph and its location
  url: "http://a.example/graphAsText",
  text: `
<#N2> <#p2> "o2" . # reference to Shape loaded from URL`
};

const { namedNode, literal, defaultGraph, quad } = N3.DataFactory;
const graphFromApi = {
  url: "http://a.example/graphFromApi",
  graph: new N3.Store()
}
graphFromApi.graph.add(quad(
  namedNode('http://a.example/graphFromApi#N3'),
  namedNode('http://a.example/p3'),
  literal('o3'),
  defaultGraph(),
));


// ShExLoader.load returns a promise to load and merge schema and data.
function collisionPolicy (type, left, right) {
  console.log(type, 'collision between', left, right);
  return false; // keep left assignment (i.e. no reassignment)
}

const schemaAndDataP = ShExLoader.load(
  { shexc: [ schemaFromUrl, schemaAsText, schemaAsShExJ ] },
  { turtle: [ graphFromUrl, graphAsText, graphFromApi ] },
  { // schemaOptions
    collisionPolicy // print collisions and keep eariler assignment
    // instead of a function, could be string: 'left', 'right' or 'throw'
  }
);

// Print out results to show off returned structure.
schemaAndDataP.then(({schema, schemaMeta, data, dataMeta}) => {
  console.log('schemaMeta:\n' + JSON.stringify(schemaMeta, null, 2));
  console.log('shapes:\n' + schema.shapes.map(s => '  ' + s.id + ' is a ' + s.shapeExpr.type).join('\n'));
  console.log('dataMeta:\n' + JSON.stringify(dataMeta, null, 2));
  console.log('triples:\n' + data.getQuads().map(
    q => '  ' +
      (['subject', 'predicate', 'object'])
      .map(t => q[t].value).join(' ')).join('\n'));
});

output:

shapeDecl collision between {
  id: 'http://a.example/S1',
  type: 'ShapeDecl',
  shapeExpr: {
    type: 'Shape',
    expression: { type: 'OneOf', expressions: [Array] }
  }
} {
  type: 'ShapeDecl',
  id: 'http://a.example/S1',
  shapeExpr: { type: 'NodeConstraint', nodeKind: 'iri', pattern: '^https?:' }
}
schemaMeta:
[ { "mediaType": "text/shex", "url": "https:…cli/1dotOr2dot.shex",
    "base": "https:…cli/1dotOr2dot.shex", "prefixes": {} },
  { "mediaType": "text/shex", "url": "http://a.example/schemaAsText",
    "base": "http://a.example/schemaAsText", "prefixes": {} },
  { "mediaType": "text/shex", "url": "http://a.example/ShExJ",
    "prefixes": {}, "_prefixes": {} }
]
shapes:
  http://a.example/schemaAsText#ShapeFromText is a Shape
  http://a.example/S1 is a NodeConstraint
dataMeta:
[ { "mediaType": "text/turtle", "url": "http://a.example/graphFromApi",
    "base": "http://a.example/graphFromApi", "prefixes": {} },
  { "mediaType": "text/turtle", "url": "http://a.example/graphAsText",
    "base": "http://a.example/graphAsText", "prefixes": {} },
  { "mediaType": "text/turtle", "url": "https:…cli/p1.ttl",
    "base": "https:…cli/p1.ttl", "prefixes": { "": "http://a.example/" } }
]
triples:
  http://a.example/graphFromApi#N3 http://a.example/p3 o3
  http://a.example/graphAsText#N2 http://a.example/graphAsText#p2 o2
  https:…cli/x http://a.example/p1 p1-0

loadExtensions function(globs[])

prototype of loadExtensions. does nothing

GET function(url, mediaType)

return promise of {contents, url}

Examples

Use @shexjs/loader directly:

const ShExIo = require("@shexjs/loader")({
  rdfjs: N3,
  fetch: require('node-fetch')
});

Extend @shexjs/loader with jsonld and a non-standard jsonld document loader:

const ShExIo = require("@shexjs/loader")({
  rdfjs: N3,
  fetch: require('node-fetch'),
  jsonld: require('jsonld'),
  jsonLdOptions: { documentLoader }
});

async function documentLoader (url, options) {
  # see https://github.com/digitalbazaar/jsonld.js#custom-document-loader
}

Lerna Monorepo

This repo uses lerna to manage multiple NPM packages. These packages are located in packages/*:

Package Sidebar

Install

npm i @shexjs/loader

Weekly Downloads

223

Version

1.0.0-alpha.28

License

MIT

Unpacked Size

42.3 kB

Total Files

6

Last publish

Collaborators

  • ericprud
  • justinwb