npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

sbolgraph

v0.51.0

Published

A library for the Synthetic Biology Open Language (SBOL) written in TypeScript, for JavaScript/TypeScript applications in the browser or node.js.

Downloads

115

Readme

This is the underlying SBOL library used by sboltools. If you just want to view and edit SBOL files from the command line, start with sboltools instead.

If you are a developer wanting to implement SBOL support in your JavaScript/TypeScript, read on.


sbolgraph is a library for the Synthetic Biology Open Language (SBOL) written in TypeScript, for JavaScript/TypeScript applications in the browser or node.js. It has also ported to Python.

Unlike existing libraries such as libSBOLj and sboljs, sbolgraph does not attempt to "load" SBOL RDF into an object oriented datastructure. Instead, sbolgraph keeps the SBOL RDF in an RDF graph, and provides "facade" classes that look like class instances but actually just wrap a URI and query/update the graph in their getters/setters.

sbolgraph is built on rdfoo, a library for creating object oriented RDF abstractions in TypeScript. It can therefore be used in conjunction with other rdfoo abstractions. For example, the PROV-O abstraction used by sbolgraph is provided by rdfoo-prov.

Example project using webpack

Implemented so far

  • Reading and writing SBOL1, SBOL2, and SBOL3
  • Converting between SBOL1, SBOL2, and SBOL3
  • Reading (converting) FASTA and GenBank

Not implemented so far

  • Writing FASTA and GenBank
  • Validation

Advantages of sbolgraph

Bi-directional properties

In sbolgraph, the bi-directional nature of RDF predicates is inherently preserved. For example, for the following fragment of SBOL:

<http://example.com/cd> a sbol:ComponentDefinition ;
	sbol:component <http://example.com/cd/subcomponent1> .

<http://example.com/cd/subcomponent1> a sbol:Component .

It is possible both to list the subcomponents of the ComponentDefinition by evaluating the partial triple (<http://example.com/cd> sbol:component ?), and also to find the containing ComponentDefinition of a subcomponent with (? sbol:component <http://example.com/cd>).

This comes naturally when the SBOL is accessed through an RDF graph structure. However, if the SBOL is stored in a class structure, for example:

class ComponentDefinition {
	Array<Component> subcomponents
}

It would be necessary to store and maintain an explicit backreference to the ComponentDefinition when deserializing and mutating SBOL:

class Component {
	ComponentDefinition* containingComponentDefinition;
}

sbolgraph avoids this by maintaining the graph and using accessors to query it, as in:

class ComponentDefinition {

	string uri

	get subcomponents {
		return match(this.subject, sbol:component, ?)
	}
}

class Component {

	string uri

	get containingComponentDefinition {
		return match(?, sbol:component, this.subject)
	}
}

No [de]serialization logic

sbolgraph doesn't need methods to load or save from an RDF graph. Instead, standard routines to serialize/deserialize an RDF graph can be used, because the graph is the only state. This means that:

  • Properties can be changed/added in classes without having to modify save/load logic
  • A whole category of serialization bugs is avoided

Performance

Is this going to be slower than the other libraries?

Marginally, but hopefully not significantly, and certainly not in time complexity terms. All of the predefined partial triple evaluations in the library are hash table lookups facilitated by a fork of rdf-graph-array with additional indexing. Hash table lookups should be O(1).