All Projects → gremlin-orm → Gremlin Orm

gremlin-orm / Gremlin Orm

Licence: mit
gremlin-orm is an ORM for graph databases in Node.js

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Gremlin Orm

Ferma
An ORM / OGM for the TinkerPop graph stack.
Stars: ✭ 130 (-4.41%)
Mutual labels:  orm, graph-database, gremlin
Express Cassandra
Cassandra ORM/ODM/OGM for Node.js with optional support for Elassandra & JanusGraph
Stars: ✭ 163 (+19.85%)
Mutual labels:  orm, gremlin
Tinkerpop
Apache TinkerPop - a graph computing framework
Stars: ✭ 1,309 (+862.5%)
Mutual labels:  graph-database, gremlin
Gremlin Javascript
JavaScript tools for graph processing in Node.js and the browser inspired by the Apache TinkerPop API
Stars: ✭ 209 (+53.68%)
Mutual labels:  graph-database, gremlin
janusgraph-docker
Yet another JanusGraph, Cassandra/Scylla and Elasticsearch in Docker Compose setup
Stars: ✭ 54 (-60.29%)
Mutual labels:  graph-database, gremlin
Janusgraph
JanusGraph: an open-source, distributed graph database
Stars: ✭ 4,277 (+3044.85%)
Mutual labels:  graph-database, gremlin
Gremlin Scala
Scala wrapper for Apache TinkerPop 3 Graph DSL
Stars: ✭ 462 (+239.71%)
Mutual labels:  graph-database, gremlin
Llvm2graphml
Explore LLVM Bitcode interactively using a graph database
Stars: ✭ 44 (-67.65%)
Mutual labels:  graph-database, gremlin
Activegraph
An active model wrapper for the Neo4j Graph Database for Ruby.
Stars: ✭ 1,329 (+877.21%)
Mutual labels:  orm, graph-database
Js Data
Give your data the treatment it deserves with a framework-agnostic, datastore-agnostic JavaScript ORM built for ease of use and peace of mind. Works in Node.js and in the Browser. Main Site: http://js-data.io, API Reference Docs: http://api.js-data.io/js-data
Stars: ✭ 1,599 (+1075.74%)
Mutual labels:  orm
Android Demos
Android develop demos
Stars: ✭ 126 (-7.35%)
Mutual labels:  orm
Neo4j Streams
Neo4j Kafka Integrations, Docs =>
Stars: ✭ 126 (-7.35%)
Mutual labels:  graph-database
Nestjs Sequelize Jwt
Nest + Sequelize + jwt
Stars: ✭ 127 (-6.62%)
Mutual labels:  orm
Vscode Cosmosdb
VS Code extension for Azure Databases
Stars: ✭ 131 (-3.68%)
Mutual labels:  gremlin
Typeorm Plus
TypeORM+ adds functionality to TypeORM intending to make the Repository and QueryBuilder more powerful.
Stars: ✭ 135 (-0.74%)
Mutual labels:  orm
Codeigniter Model
CodeIgniter 3 Active Record (ORM) Standard Model with Laravel Eloquent & Yii2 AR like
Stars: ✭ 124 (-8.82%)
Mutual labels:  orm
Flywheel
Object mapper for Amazon's DynamoDB
Stars: ✭ 124 (-8.82%)
Mutual labels:  orm
Arangodb
🥑 ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.
Stars: ✭ 11,880 (+8635.29%)
Mutual labels:  graph-database
Sandman2
Automatically generate a RESTful API service for your legacy database. No code required!
Stars: ✭ 1,765 (+1197.79%)
Mutual labels:  orm
Reddit Detective
Play detective on Reddit: Discover political disinformation campaigns, secret influencers and more
Stars: ✭ 129 (-5.15%)
Mutual labels:  graph-database

gremlin-orm

Build Status Coverage Status

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 = require('gremlin-orm');
const g = new gremlinOrm('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.define('person', {
  name: {
    type: g.STRING,
    required: true
  },
  age: {
    type: g.NUMBER
  }
});

Person.create(req.body, (error, result) => {
  if (error) {
    res.send(error);
  }
  else {
    res.send(result);
    // result formatted as nice JSON Object
    /*
      {
        "id": "1",
        "label": "person",
        "name": "Bob",
        "age": 20
      }
    */
  }
});

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 localhost
  • options: Options object which takes the same parameters as gremlin-javascript's createClient()
    • 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 proxy
    • ssl: 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 authentication
    • password : password to use for SASL authentication

Example

const gremlinOrm = require('gremlin-orm');
const g = new gremlinOrm(['azure', 'partitionName'], '443', 'example.com', {ssl: true, user: 'sample-user', password: 'sample-password'});

Methods

Defining Models

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) has out 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.find({'name': 'John'}).findRelated('knows', {'since': '2015'}, (error, result) => {
    // Send people John knows to client
  })

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.find({'name': 'John'}), (error, result) => {
    let john = result;
    john.findRelated('knows', {'since': '2015'}, (error, result) => {
      // Send people John knows to client
    })
  })

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 model
  • schema: A schema object which defines allowed property keys and allowed values/types for each key
Example
const Person = g.define('person', {
  name: {
    type: g.STRING,
    required: true
  },
  age: {
    type: g.NUMBER
  }
});

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 model
  • schema: A schema object which defines allowed property keys and allowed values/types for each key
Example
const Knows = g.defineEdge('knows', {
  from: {
    type: g.STRING
  },
  since: {
    type: g.DATE
  }
});

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 string
  • raw (optional, default = false): If true, will return the raw data from the graph database instead of normally formatted JSON
  • callback (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.find({'name': 'John'}).query(query, true, (error, result) => {
    // send raw data to client
  });

queryRaw(queryString, callback)

.queryRaw performs a raw query on the gremlin-orm root and returns raw data

Arguments
  • queryString: Gremlin query as a string
  • callback: 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.queryRaw(query, (error, result) => {
    // send raw data to client
  });

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 update
  • callback: Some callback function with (error, result) arguments
Example
  Person.find({'name': 'John'}).update({'age', 30}, (error, result) => {
    // send data to client
  });

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.find({'name', 'John'}, (error, result) => {
    if (result) result.delete((error, result) => {
      // check if successful delete
    });
  });

order(property, order, [callback])

.order sorts the results by a property in ascending or descending order

Arguments
  • property: Name of property to order by
  • order: Order to sort - 'ASC' or 'DESC'
  • callback (optional): Some callback function with (error, result) arguments
Example
  Person.findAll({'occupation': 'developer'}).order('age', 'DESC', (error, result) => {
    // Return oldest developers first
  });

limit(num, [callback])

.limit limits the query to only the first num objects

Arguments
  • num: Max number of results to return
  • callback (optional): Some callback function with (error, result) arguments
Example
  Person.find({'name': 'John'}).findEdge('knows').limit(100, (error, result) => {
    // Return first 100 people that John knows
  });

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 schema
  • callback: 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.create({'name': 'John', 'age': 30}, (error, result) => {
    // Returns the newly created vertex
    /*
      {
        "id": "1",
        "label": "person",
        "name": "John",
        "age": 30
      }
    */
  });

find({props}, [callback])

.find finds the first vertex with properties matching props object

Arguments
  • props: Object containing key value pairs of properties
  • callback (optional): Some callback function with (error, result) arguments
Returns
  • Returns the first matching vertex as an object
Example
  Person.find({'name': 'John'}, (error, result) => {
    // Returns first vertex found matching props
    /*
      {
        "id": "1",
        "label": "person",
        "name": "John",
        "age": 30
      }
    */
  });

findAll({props}, [callback])

.findAll finds the all vertices with properties matching props object

Arguments
  • props: Object containing key value pairs of properties
  • callback (optional): Some callback function with (error, result) arguments
Returns
  • Returns an array containing all vertices matching props as objects
Example
  Person.findAll({'age': 30}, (error, result) => {
    // Returns array of matching vertices
    /*
      [
        {
          "id": "1",
          "label": "person",
          "name": "John",
          "age": 30
        },
        {
          "id": "2",
          "label": "person",
          "name": "Jane",
          "age": 30
        }
      ]
    */
  });

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 recommended
  • props: Object containing key value pairs of properties to place on new edges
  • vertex: Vertex model instances or vertex model query
  • both (optional, default = false): If true, will create edges in both directions
  • callback: Some callback function with (error, result) arguments
Returns
  • Returns an array containing all new created edges
Examples
  // Chaining vertex methods
  Person.findAll({'age': 20}).createEdge(Uses, {'frequency': 'daily'}, Website.find({'name': 'Facebook'}), (error, result) => {
    // Result is array of newly created edges from everyone with age 20 to the website 'Facebook'
  });

  // Calling .createEdge on model instances
  Person.findAll({'occupation': 'web developer'}, (error, results) => {
    let developers = results;
    Language.findAll({'name': ['Javascript', 'HTML', 'CSS']}, (error, results) => {
      let languages = results;
      developers.createEdge(Uses, {}, languages, (error, result) => {
        // Result is array of newly created edge objects from each web developers
        // to each of the 3 important components of web development
      });
    });
  });


  // Creating edges both ways
  Person.find({'name': 'Jane'}, (error, result) => {
    let jane = result;
    Person.find({'name' : 'John'}).createEdge(Knows, {since: '1999'}, jane, true, (error, result) => {
      // Creates two edges so that John knows Jane and Jane also knows John
    })
  });

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 recommended
  • props: Object containing key value pairs of properties to match on edge relationships
  • callback (optional): Some callback function with (error, result) arguments
Returns
  • Returns an array containing all connected edges
Examples
Person.find({'name': 'John'}).findEdge(Knows, {'from': 'school'}, (error, result) => {
  // Result is array of edge objects representing all the 'knows' relationships of John
  // where John knows the person from school (edge model property)
});

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 relationships
  • depth: Depth of edge traversals to make
  • inModel (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.find({'name': 'John'}).findRelated(Knows, {}, 2, (error, result) => {
  // Result is array of Person records representing John's friends of friends
});

Person.find({'name': 'John'}).findRelated(Likes, {}, 1, Movie, (error, result) => {
  // Result is array of Movie records that John likes.
});

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 relationships
  • callback (optional): Some callback function with (error, result) arguments
Returns
  • Returns an array containing all related vertices
Examples
Person.find({'name': 'John'}).findImplicit('created', {}, (error, result) => {
  // Result is array of vertex objects representing people who have co-created things that John created
});

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 call
  • in: Vertex instance(s) or find/findAll method call
  • props: Object containing key value pairs of properties to add on the new edge
  • both (optional, default = false): If true, will create edges in both directions
  • callback: Some callback function with (error, result) arguments
Returns
  • Returns newly created edge object
Examples
Person.find({'name': 'Joe'}, (error, result) => {
  let joe = result;
  Knows.create(Person.find({'name': 'John'}), joe, {'since': 2015}, (error, result) => {
    // Returns the newly created edge
    /*
      {
        "id": "1",
        "label": "knows",
        "since": "2015",
        "outV": "1",  // John's id
        "inV": "2",   // Joe's id
      }
    */
  });
});

find({props}, [callback])

.find finds the first edge with properties matching props object

Arguments
  • props: Object containing key value pairs of properties
  • callback (optional): Some callback function with (error, result) arguments
Returns
  • Returns the first matching edge as an object
Example
  Knows.find({'since': 2015}, (error, result) => {
    // Returns first edge found matching props
    /*
      {
        "id": "1",
        "label": "knows",
        "since": 2015,
        "outV": 1,
        "inV": 123
      }
    */
  });

findAll({props}, [callback])

.findAll finds the all edges with properties matching props object

Arguments
  • props: Object containing key value pairs of properties
  • callback (optional): Some callback function with (error, result) arguments
Returns
  • Returns an array containing all edges matching props as objects
Example
  Knows.findAll({'since': 2015}, (error, result) => {
    // Returns array of matching edges
    /*
      [
        {
          "id": "1",
          "label": "knows",
          "since": 2015,
          "outV": 1,
          "inV": 123
        },
        {
          "id": "2",
          "label": "knows",
          "since": 2015,
          "outV": 1,
          "inV": 200
        }
      ]
    */
  });

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 vertices
  • callback (optional): Some callback function with (error, result) arguments
Returns
  • Returns an array containing all vertices connected by current edge(s)
Example
Knows.find({'through': 'school'}).findVertex(Person, {'occupation': 'developer'}, (error, result) => {
  // Result is array of people who are developers who know other people through school
});

Contributing

Please submit issues/pull requests if you have feedback or message the gremlin-orm team to be added as a contributor: [email protected]

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

Resources

Apache TinkerPop Gremlin Reference

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].