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

@xgraph/core

v5.2.1

Published

A powerful and flexible graph structure for JS

Downloads

38

Readme

@xgraph/core

A core graph data structure: multiedged, directed and cyclic

API

class:Graph()

Create a new instance of a Graph.

Graph::setVertex(id: string, type:string, props={})

Set a vertex (create or update) with an id and a type.

g.setVertex('foo', 'Person', { name: 'Foo Bar', age: 23 });

Graph::vertex(id:string)

Get a vertex by its id.

g.vertex('foo').name === 'Foo Bar';

Graph::hasVertex(id:string)

Check if a vertex exists by its id.

g.hasVertex('foo') === true;

Graph::removeVertex(id:string)

Remove a vertex by its id and all of its edges. Returns all of the discarded edges.

g.removeVertex('foo');

Graph::setEdge(originVertexId:string, targetVertexId:string, type:string, properties={})

Ensure an edge of type type from vertex origin to vertex target.

g.setEdge('foo', 'bar', 'friendOf');

Graph::edge(originVertexId:string, targetVertexId:string, type:string)

Get the type edge from origin to target if exists, null otherwise.

g.edge('foo', 'bar', 'friendOf').type === 'friends';
g.edge('foo', 'bar', 'father') === null;

Graph::hasEdge(originVertexId:string, targetVertexId:string, type?:string)

Check if an edge from origin to target exists (specifically of type type, if given).

g.hasEdge('foo', 'bar', 'friendOf') === true;

Graph::removeEdge(originVertexId:string, targetVertexId:string, type:string)

Remove a type edge from origin to target.

g.removeEdge('foo', 'bar', 'friendOf');

Graph::inEdges(targetVertexId:string), Graph::outEdges(originVertexId:string), Graph::interEdges(originVertexId:string, targetVertexId:string), Graph::allEdges(vertexId:string)

Get all edges to target, all edges from origin, all edges from origin to target, all edges involving vertexId - respectively.

Graph::vertices()

An iterator over all the graph's vertices.

Graph::vertices(type:string)

An iterator over all the graph's vertices of a given type.

Graph::vertices(type:string, searchObject:object)

An iterator over all the graph's vertices of a given type, filtering using monjo syntax, using Indices where possible.

Graph::vertices(searchObject:object)

An iterator over all the graph's vertices, filtering using monjo syntax, using Indices where possible.

Note: Using the unIndexed monjo version for all vertices will, inevitaly, be slower than simply using graph.vertices().filter(...) instead.

Note: Using the type parameter is syntactic sugar for querying the Graph.TYPE auto Index, which means that using it with an Index (and especially a Typed Index) will incur an Index Intersection performance penalty.

Graph::toObject(), Graph.fromObject(bareObject)

Serialize and de-serialize the graph

Usage

const Graph = require('@xgraph/core');
const g = new Graph();

g.setVertex('foo', 'Person', { name: 'Foo Bar', age: 23 });
g.setVertex('bar', 'Person', { name: 'Bar Bar', age: 22 });
g.setEdge('foo', 'bar', 'friendOf');
g.outEdges('foo')
  .filter(({ type }) => type === 'friendsOf')
  .map(({ target }) => g.vertex(target).age); // [22]

Advnced Usage - Indexing

Should you wish to, you may add (and remove) Indices for better querying performances.

Graph::addIndex(prop:string, type?:string)

Create an Index for prop, possibly limited to only vertices of type type. Notice: creating an index of property prop drops any existing index of that property.

Graph::dropIndex(prop:string)

Drop any existing Index for property prop;

Graph::hasIndex(prop:string)

Return whether or not an Index for property prop exists.

Benchmarks

Benchmarks for 1000000 vertices:
Setup [no initial Index]: 2237.697ms
Setup [with initial index]: 3374.034ms
Querying over all vertices, 50 times [no index, no type annotation, monjo syntax]: 7344.953ms
Querying over all vertices, 50 times [no index, with type annotation, monjo syntax]: 29761.764ms
Querying over all vertices, 50 times [no index, no type annotation, classic filter]: 1428.090ms
Querying over all vertices, 50 times [no index, with type annotation, classic filter]: 19563.437ms
Creating an index for all vertices: 439.150ms
Querying over all vertices, 50 times [with index, no type annotation]: 0.431ms
Querying over all vertices, 50 times [with index, with type annotation]: 0.738ms