gremlin-orm
gremlin-orm is an ORM for graph databases in Node.js. Currently working on Neo4j and Microsoft Azure Cosmos DB with more to come in the future.
Installation
$ npm install --save gremlin-orm
Example
const gremlinOrm = ;const g = 'neo4j'; // connects to localhost:8182 by default // Can pass more configuation// const g = new gremlinOrm(['azure', 'partition-name'], process.env.GPORT, process.env.GHOST, {ssl: true, user: process.env.GUSER, password: process.env.GPASS}); const Person = g; Person;
Documentation
Initialization
Initialize the gremlin-orm instance with parameters matching the gremlin-javascript createClient()
initialization - with the addition of the dialect argument.
Arguments
dialect
(string or Array): Required argument that takes string ('neo4j'
) or array (['azure', '<partitionName>']
).port
: Defaults to '8182'host
: Defaults to localhostoptions
: Options object which takes the same parameters as gremlin-javascript'screateClient()
session
: whether to use sessions or not (default:false
)language
: the script engine to use on the server, see your gremlin-server.yaml file (default:"gremlin-groovy"
)op
(advanced usage): The name of the "operation" to execute based on the available OpProcessor (default:"eval"
)processor
(advanced usage): The name of the OpProcessor to utilize (default:""
)accept
(advanced usage): mime type of returned responses, depending on the serializer (default:"application/json"
)path
: a custom URL connection path if connecting to a Gremlin server behind a WebSocket proxyssl
: whether to use secure WebSockets or not (default:false
)rejectUnauthorized
: when using ssl, whether to reject self-signed certificates or not (default:true
). Useful in development mode when using gremlin-server self signed certificates. Do NOT use self-signed certificates with this option in production.user
: username to use for SASL authenticationpassword
: password to use for SASL authentication
Example
const gremlinOrm = ;const g = 'azure' 'partitionName' '443' 'example.com' ssl: true user: 'sample-user' password: 'sample-password';
Methods
Defining Models
- define - alias for defineVertex
- defineVertex - define a new Vertex model
- defineEdge - define a new Edge model
Generic Methods
- query - run a Gremlin query string on a Model
- queryRaw - perform a raw query on the gremlin-orm root and return raw data
- update - update specific props on an existing vertex or edge
- delete - delete an existing vertex or edge
- order - order the results by property and asc/desc
- limit - limit the number of results returned
Vertex Methods
- create - create a new vertex
- find - find first vertex with matching properties
- findAll - find all vertices with matching properties
- createEdge - define a new edge relationship to another vertex(es)
- findEdge - find edges directly connected to the relevant vertex(es)
- findRelated - find all vertices connected to initial vertex(es) through a type of edge with optional properties
- findImplicit - find all vertices which have the same edge relations
in
that the current vertex(es) hasout
to another vertex
Edge Methods
- create - create new edge relationship(s) by passing in two vertices or sets of vertices
- find - find first edge with matching properties
- findAll - find all edges with matching properties
- findVertex - find all vertices that are connected by the relevant edges
Method Chaining
In order to avoid sacrificing the power of Gremlin traversals, method calls in this ORM can take advantage of method chaining. Any read-only method will avoid running its database query and instead pass its Gremlin query string to the next method in the chain if it is not given a callback. Note: All create, update, and delete methods require a callback and can not have more methods chained after.
Example
// Only makes one call to the database Person
Additionally, results returned in the form of JSON objects will retain their relevant model methods for additional queries.
// Makes two calls to the database Person { let john = result; john })
Defining Models
This ORM utilizes Model definitions similar to Sequelize to add structure to developing servers around graph databases. Queries outside of the constraints of pre-defined models can be run using the generic .query
or .queryRaw
.
define(label, schema)
.define
is an alias for defineVertex
defineVertex(label, schema)
.defineVertex
defines a new instance of the VertexModel
class - see generic and vertex model methods
Arguments
label
: Label to be used on all vertices of this modelschema
: A schema object which defines allowed property keys and allowed values/types for each key
Example
const Person = g;
defineEdge(label, schema)
.defineEdge
defines a new instance of the EdgeModel
class - see generic and edge model methods
Arguments
label
: Label to be used on all edges of this modelschema
: A schema object which defines allowed property keys and allowed values/types for each key
Example
const Knows = g;
Model Data types
The following options are available when defining model schemas:
type
: Use Sequelize-like constants to define data types. Date properties will be returned as javascript Date objects unless returning raw data. The following data type constants are currently available with possibly more in the future.g.STRING
g.NUMBER
g.DATE
g.BOOLEAN
required
(default = false): If true, will not allow saving to database if not present or empty
Generic Methods
query(queryString, [raw, callback])
.query
takes a raw Gremlin query string and runs it on the object it is called on.
Arguments
queryString
: Gremlin query as a stringraw
(optional, default = false): If true, will return the raw data from the graph database instead of normally formatted JSONcallback
(optional, required if raw is true): Some callback function with (error, result) arguments.
Returns
- If callback is given, returns array where 0th index is array of Vertex results and 1th index is array of Edge results (even if either is empty) -- this helps expose the correct model methods if the query returns edges from a query on a vertex or vis versa.
Example
let query = ".as('a').out('created').as('b').in('created').as('c').dedup('a','b').select('a','b','c')" Person;
queryRaw(queryString, callback)
.queryRaw
performs a raw query on the gremlin-orm root and returns raw data
Arguments
queryString
: Gremlin query as a stringcallback
: Some callback function with (error, result) arguments
Example
// query must be a full Gremlin query string let query = "g.V(1).as('a').out('created').as('b').in('created').as('c').dedup('a','b').select('a','b','c')" g;
update({props}, callback)
.update
takes a properties object and updates the relevant properties on the model instance it is called on.
Arguments
props
: Object containing key value pairs of properties to updatecallback
: Some callback function with (error, result) arguments
Example
Person;
delete(callback)
.delete
removes the object(s) it is called on from the database.
Arguments
callback
: Some callback function with (error, result) arguments
Example
Person;
order(property, order, [callback])
.order
sorts the results by a property in ascending or descending order
Arguments
property
: Name of property to order byorder
: Order to sort - 'ASC' or 'DESC'callback
(optional): Some callback function with (error, result) arguments
Example
Person;
limit(num, [callback])
.limit
limits the query to only the first num
objects
Arguments
num
: Max number of results to returncallback
(optional): Some callback function with (error, result) arguments
Example
Person;
Vertex Methods
create({props}, callback)
.create
creates a new vertex with properties matching props object
Arguments
props
: Object containing key value pairs of properties matching defined Model schemacallback
: Some callback function with (error, result) arguments
Returns
- Returns the newly created vertex object (with a unique ID) or an error object of failed schema checks
Example
Person;
find({props}, [callback])
.find
finds the first vertex with properties matching props object
Arguments
props
: Object containing key value pairs of propertiescallback
(optional): Some callback function with (error, result) arguments
Returns
- Returns the first matching vertex as an object
Example
Person;
findAll({props}, [callback])
.findAll
finds the all vertices with properties matching props object
Arguments
props
: Object containing key value pairs of propertiescallback
(optional): Some callback function with (error, result) arguments
Returns
- Returns an array containing all vertices matching props as objects
Example
Person;
createEdge(edge, {props}, vertex, [both,] callback)
.createEdge
creates new edge relationships from starting vertex(es) to vertex(es) passed in.
Arguments
edge
: Edge model. If a string label is passed, no schema check will be done - edge model is recommendedprops
: Object containing key value pairs of properties to place on new edgesvertex
: Vertex model instances or vertex model queryboth
(optional, default = false): If true, will create edges in both directionscallback
: Some callback function with (error, result) arguments
Returns
- Returns an array containing all new created edges
Examples
// Chaining vertex methods Person; // Calling .createEdge on model instances Person; // Creating edges both ways Person;
findEdge(edge, {props}, [callback])
.findEdge
finds edges directly connected to the relevant vertex(es)
Arguments
edge
: Edge model. If a string label is passed, no schema check will be done - edge model is recommendedprops
: Object containing key value pairs of properties to match on edge relationshipscallback
(optional): Some callback function with (error, result) arguments
Returns
- Returns an array containing all connected edges
Examples
Person;
findRelated(edge, {props}, depth, [inModel, callback])
.findRelated
finds vertices related through the desired edge relationship.
Arguments
edge
: Edge model. If a string label is passed, no schema check will be done - edge model is recommended.props
: Object containing key value pairs of properties to match on edge relationshipsdepth
: Depth of edge traversals to makeinModel
(optional, default =this
): Vertex model of results to find. Can pass a vertex model (Person
) or label string ('person'
) -- vertex model is recommended.callback
(optional): Some callback function with (error, result) arguments
Returns
- Returns an array containing all related vertices
Examples
Person; Person;
findImplicit(edge, {props}, [callback])
.findImplicit
finds vertices that are related to another vertex the same way the original vertex is.
Arguments
edge
: Edge model. If a string label is passed, no schema check will be done - edge model is recommended.props
: Object containing key value pairs of properties to match on edge relationshipscallback
(optional): Some callback function with (error, result) arguments
Returns
- Returns an array containing all related vertices
Examples
Person;
Edge Methods
create(out, in, {props}, callback)
.create
creates an index from out
vertex(es) to the in
vertex(es)
Arguments
out
: Vertex instance(s) or find/findAll method callin
: Vertex instance(s) or find/findAll method callprops
: Object containing key value pairs of properties to add on the new edgeboth
(optional, default = false): If true, will create edges in both directionscallback
: Some callback function with (error, result) arguments
Returns
- Returns newly created edge object
Examples
Person;
find({props}, [callback])
.find
finds the first edge with properties matching props object
Arguments
props
: Object containing key value pairs of propertiescallback
(optional): Some callback function with (error, result) arguments
Returns
- Returns the first matching edge as an object
Example
Knows;
findAll({props}, [callback])
.findAll
finds the all edges with properties matching props object
Arguments
props
: Object containing key value pairs of propertiescallback
(optional): Some callback function with (error, result) arguments
Returns
- Returns an array containing all edges matching props as objects
Example
Knows;
findVertex(vertexModel, {props}, [callback])
.findVertex
finds the all vertices with properties matching props object connected by the relevant edge(s)
Arguments
vertexModel
: Vertex model. If a string label is passed, no schema check will be done - vertex model is recommended.props
: Object containing key value pairs of properties to find on verticescallback
(optional): Some callback function with (error, result) arguments
Returns
- Returns an array containing all vertices connected by current edge(s)
Example
Knows;
Contributing
Please submit issues/pull requests if you have feedback or message the gremlin-orm team to be added as a contributor: gremlin.orm@gmail.com
Authors
Freeman Chen (https://github.com/freemanchen)
Gordon Farquharson (https://github.com/godronus)
Jeremy Lee (https://github.com/jeremyslee)
License
This project is licensed under the MIT License