Plans for Knora API v2

Naming

In API v1, the same data types are named inconsistently (resinfo, res_info) or unclearly (value_restype is actually a label). Version 2 should adopt a clear, consistent naming convention.

Structure

API v1 sometimes uses parallel array structures to represent multiple complex objects, e.g. the values of resource properties or the items in a resource’s context. Version 2 should use nested structures instead.

Redundancy

Some information in API v1 is presented redundantly, e.g. resinfo and resdata, and the __location__ property. This should be cleaned up.

Efficiency

Some queries, like the resource context query, produce so much data that they cannot be made efficient. We should consider breaking up these API calls into smaller chunks.

It should be possible to customise GET requests so that they return only as much data as the user wants. For example, in Fedora 4’s equivalent of the resources route with reqtype=full, you can specify whether you want child resources and incoming references. This would enable clients to request only the information they actually need, improving performance and reducing server load.

Suitability for non-GUI applications

When returning the ‘full’ information about a resource, the API currently includes valueless properties to reflect the possible properties in the resource type (if a property has no value, or only has values that the user isn’t allowed to see), unless a property already has a value that the user isn’t allowed to see, and its cardinality is MustHaveOne or MayHaveOne. This makes sense from the point of a GUI: the valueless properties are there to indicate that the user could add values for those properties. If a property already has a value and its cardinality is MustHaveOne or MayHaveOne, the user can’t add a value for it, so there is no reason to include it.

In version 2, it might make more sense to separate information about resource types from information about resources (rather than mixing these two kinds of information together in one API response), and to separate displaying a resource from indicating which properties a particular user can add.

Working with multiple projects

The user will be able to choose which project to use for an update.

We will handle the case where Project A defines a resource class X, and Project B declares a resource class Y with additional properties, asserting that X is a subclass of Y, so that users in Project B can add these extra properties to resources that already exist in Project A. Users in project A will want to be able to ignore the extra properties from Y, or optionally see and use them.

The ontology responder will distinguish between definitions in the active project’s named graph and definitions added elsewhere, so the user can choose to see just what’s defined in their own project or to include definitions from elsewhere.

Annotating values

In API v1, only resources can be annotated. In v2, it will also be possible to annotate values.

Typing

Each data item should have a consistent data type. In an JSON object, the same name should always contain a value of the same type. Numbers should be represented as numbers rather than as strings.

JSON-LD

Consider using JSON-LD to specify data types and semantics within API responses, instead of providing separate JSON schemas.

The basic idea is just that your API can return JSON like this:

{
  "book": {
    "id": "http://data.knora.org/c5058f3a"
    "title": "Zeitglöcklein des Lebens und Leidens Christi"
  }
}

and it can also include a “context” (which can be embedded in the same JSON, or provided as the URL of a separate JSON document) specifying that book is an incunabula:book, and that title means dc:title. So everything in an API response can have semantics and type information specified. The idea is that the keys in the JSON stay short and readable, so someone writing a simple browser-based client can write book.title in JavaScript and it will work. At the same time, a more complex, automated client can easily get the semantic and type information.