Object Graph Mapper for Dgraph
npm install @shynome/gverse#### Install
```
yarn add gverse@npm:@shynome/gverse
#### Object Graph Mapper for Dgraph
!GitHub !CircleCI !npm type definitions !GitHub package.json version
Gverse is an Object Graph Mapper (OGM) for the Dgraph, the high-performance open-source Graph Database. Gverse is written in TypeScript and supports TypeScript 3 and JavaScript ES6.
#### What's an OGM?
An OGM enables developers to work with their graph models through idiomatic objects provided by their native programming language. It is similar in concept to Object-Relational Mapping (ORM) libraries such as TypeORM, Sequelize or Hibernate but with some fundamental differences (see below).
#### Features
- Simple API for working with graphs vertices (nodes) and edges (links)
- Strongly typed classes and predicates (attributes) when using TypeScript
- Automatically marshal and unmarshal JavaScript objects to and from Graph vertices
- Support for custom marshaling and unmarshaling methods
- Support for directed and undirected edges
- Support for transactions and batch updates
- Before and after hooks for create, update and delete operations
- Query options for ordering and pagination
Roadmap:
- Decorators for object-to-graph mapping (v1.1)
- Support for Dgraph 1.1 Types
##### Compatibility with Dgraph
Gverse supports Dgraph version 1.0.x. Work is underway for supporting the new Type System in Dgraph 1.1.
Here's a quick start guide to get you up and running.
#### Install Dgraph
Make sure you have Dgraph installed and running. This guide assumes you have Dgraph running on default ports (8080 for HTTP and 9080 gRPC).
#### Set up your TypeScript or JavaScript ES6 environments
Gverse requires ES6 with class properties plugin or TypeScript ≥ 2.0.
- Configure your project for TypeScript (see getting started guide),
– or –
- Configure Babel (see quick start guide) and add the Class Properties Plugin.
#### Install the Gverse package
`sh`
npm install gverse
or if you prefer, yarn add gverse. The package includes TypeScript types.
#### Create a Gverse graph session
`typescript
import Gverse from "gverse"
const graph = new Gverse.Graph(
new Gverse.Connection({ host: "localhost", port: 9080 })
)
`
#### Define a vertex class
`typescript`
class User extends Gverse.Vertex {
type = "User"
name: string = ""
}
#### Create the vertex on the graph
`typescript`
const user = new User()
user.name = "Zak"
await graph.create(user)
#### Load a vertex from the graph
`typescript`
const user = (await graph.get(uid)) as User
console.log(user.name) // = "Zak"
For detailed examples, please see the integration tests under ./test/integration.
#### Defining edges (links to other vertices)
`typescript`
class Repo {
type: "Repository"
name: string
owner: User
contributors: User[]
_edges: {
owner: Edge.toVertex(User),
contributors: Edge.toVertices(User)
}
}
Edges can be directed or undirected (reversible), and can have a cardinality of one or many. For detailed examples, please see the integration tests under ./test/integration.
Test coverage for Gverse comes from integration tests. Docker and Docker-Compose are required for running integration tests.
`sh``
./run-integration-tests.sh
#### Gverse OGM vs Traditional ORMs
Gverse has some fundamental differences to popular ORMs. It's helpful to understand the key differences:
- Gverse works with vertices and edges in a Graph structure instead of tables, columns and rows in RDBMS like MySQL, Postgres, Oracle, or documents in MongoDB, CouchDB, etc. (learn more).
- Gverse schema supports dynamic typing. You do not need to define and migrate schemas. Predicates (attributes) can be added as needed, with their data types inferred by value.
- A schema definition is required for any type that is part of a query or filter function. Both the type and the index needs to be defined and applied. .
- Advanced graph queries in Gverse are written using GraphQL± (a variant of GraphQL).