All Projects → schwartzmx → gremtune

schwartzmx / gremtune

Licence: MIT license
Golang Gremlin Tinkerpop client with AWS Neptune compatibility

Programming Languages

go
31211 projects - #10 most used programming language

Projects that are alternatives of or similar to gremtune

Tinkerpop
Apache TinkerPop - a graph computing framework
Stars: ✭ 1,309 (+5591.3%)
Mutual labels:  gremlin, tinkerpop
Gremlin Javascript
JavaScript tools for graph processing in Node.js and the browser inspired by the Apache TinkerPop API
Stars: ✭ 209 (+808.7%)
Mutual labels:  gremlin, tinkerpop
janusgraph-docker
Yet another JanusGraph, Cassandra/Scylla and Elasticsearch in Docker Compose setup
Stars: ✭ 54 (+134.78%)
Mutual labels:  gremlin, tinkerpop
Ferma
An ORM / OGM for the TinkerPop graph stack.
Stars: ✭ 130 (+465.22%)
Mutual labels:  gremlin, tinkerpop
Unipop
Data Integration Graph
Stars: ✭ 184 (+700%)
Mutual labels:  gremlin, tinkerpop
Ogre
Clojure library for querying Apache TinkerPop graphs
Stars: ✭ 118 (+413.04%)
Mutual labels:  gremlin, tinkerpop
Goblin
A Python 3.5 rewrite of the TinkerPop 3 OGM Goblin
Stars: ✭ 90 (+291.3%)
Mutual labels:  gremlin, tinkerpop
Gremlin.Net
This repository only contains an outdated version of Gremlin.Net. For newer version head to Apache TinkerPop.
Stars: ✭ 21 (-8.7%)
Mutual labels:  gremlin, tinkerpop
jelass
Janus + Elastic Search + Cassandra docker container with SSL Client Certificates implemented.
Stars: ✭ 13 (-43.48%)
Mutual labels:  gremlin, tinkerpop
gremlin-ogm
An Object Graph Mapping Library For Gremlin
Stars: ✭ 32 (+39.13%)
Mutual labels:  gremlin, tinkerpop
gizmo
OGM
Stars: ✭ 20 (-13.04%)
Mutual labels:  gremlin, tinkerpop
Janusgraph
JanusGraph: an open-source, distributed graph database
Stars: ✭ 4,277 (+18495.65%)
Mutual labels:  gremlin, tinkerpop
sqerzo
Tiny ORM for graph databases: Neo4j, RedisGraph, AWS Neptune or Gremlin
Stars: ✭ 28 (+21.74%)
Mutual labels:  gremlin, aws-neptune
Cypher For Gremlin
Cypher for Gremlin adds Cypher support to any Gremlin graph database.
Stars: ✭ 267 (+1060.87%)
Mutual labels:  gremlin, tinkerpop
Exram.gremlinq
A .NET object-graph-mapper for Apache TinkerPop™ Gremlin enabled databases.
Stars: ✭ 84 (+265.22%)
Mutual labels:  gremlin, tinkerpop
Vscode Cosmosdb
VS Code extension for Azure Databases
Stars: ✭ 131 (+469.57%)
Mutual labels:  gremlin
mod-tinkerpop-persistor
Vert.x 2.x Persistor Module for Tinkerpop-compatible Graph Databases
Stars: ✭ 17 (-26.09%)
Mutual labels:  tinkerpop
yang-db
YANGDB Open-source, Scalable, Non-native Graph database (Powered by Elasticsearch)
Stars: ✭ 92 (+300%)
Mutual labels:  gremlin
Amazon Neptune Samples
Samples and documentation for using the Amazon Neptune graph database service
Stars: ✭ 229 (+895.65%)
Mutual labels:  gremlin
Graph Notebook
Library extending Jupyter notebooks to integrate with Apache TinkerPop and RDF SPARQL.
Stars: ✭ 199 (+765.22%)
Mutual labels:  gremlin

gremtune

GoDoc Build Status Go Report Card

gremtune is a fork of qasaur/gremgo with alterations to make it compatible with AWS Neptune which is a "Fast, reliable graph database built for the cloud".

gremtune is a fast, efficient, and easy-to-use client for the TinkerPop graph database stack. It is a Gremlin language driver which uses WebSockets to interface with Gremlin Server and has a strong emphasis on concurrency and scalability. Please keep in mind that gremtune is still under heavy development and although effort is being made to fully cover gremtune with reliable tests, bugs may be present in several areas.

Modifications were made to gremgo in order to "support" AWS Neptune's lack of Gremlin-specific features, like no support query bindings among others. See differences in Gremlin support here: AWS Neptune Gremlin Implementation Differences

Installation

go get github.com/schwartzmx/gremtune
dep ensure

Documentation

Example

package main

import (
    "fmt"
    "log"

    "github.com/schwartzmx/gremtune"
)

func main() {
    errs := make(chan error)
    go func(chan error) {
        err := <-errs
        log.Fatal("Lost connection to the database: " + err.Error())
    }(errs) // Example of connection error handling logic

    dialer := gremtune.NewDialer("ws://127.0.0.1:8182") // Returns a WebSocket dialer to connect to Gremlin Server
    g, err := gremtune.Dial(dialer, errs) // Returns a gremtune client to interact with
    if err != nil {
        fmt.Println(err)
        return
    }
    res, err := g.Execute( // Sends a query to Gremlin Server
        "g.V('1234')"
    )
    if err != nil {
        fmt.Println(err)
        return
    }
    j, err := json.Marshal(res[0].Result.Data) // res will return a list of resultsets,  where the data is a json.RawMessage
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    fmt.Printf("%s", j)
}

Example for streaming the result

Neptune provides 64 values per Response that is why Execute at present provides a [] of Response since it waits for all the responses to be retrieved and then provides it.In ExecuteAsync method it takes a channel to provide the Response as request parameter and provides the Response as and when it is provided by Neptune. The Response are streamed to the caller and once all the Responses are provided the channel is closed. go test -v -run ExecuteBulkDataAsync is the cmd to run the testcase)

package main

import (
    "fmt"
    "log"
    "time"
    "strings"
    "github.com/schwartzmx/gremtune"
)

func main() {
    errs := make(chan error)
    go func(chan error) {
        err := <-errs
        log.Fatal("Lost connection to the database: " + err.Error())
    }(errs) // Example of connection error handling logic

    dialer := gremtune.NewDialer("ws://127.0.0.1:8182") // Returns a WebSocket dialer to connect to Gremlin Server
    g, err := gremtune.Dial(dialer, errs) // Returns a gremtune client to interact with
    if err != nil {
        fmt.Println(err)
        return
    }
    start := time.Now()
    responseChannel := make(chan AsyncResponse, 10)
    err := g.ExecuteAsync( // Sends a query to Gremlin Server
        "g.V().hasLabel('Employee').valueMap(true)", responseChannel
    )
    log.Println(fmt.Sprintf("Time it took to execute query %s", time.Since(start)))
    if err != nil {
        fmt.Println(err)
        return
    }
    count := 0
    asyncResponse := AsyncResponse{}
    start = time.Now()
    for asyncResponse = range responseChannel {
        log.Println(fmt.Sprintf("Time it took to get async response: %s response status: %v", time.Since(start), asyncResponse.Response.Status.Code))
        count++
        
        nl := new(BulkResponse)
        datastr := strings.Replace(string(asyncResponse.Response.Result.Data), "@type", "type", -1)
        datastr = strings.Replace(datastr, "@value", "value", -1)
        err = json.Unmarshal([]byte(datastr), &nl)
        if err != nil {
           fmt.Println(err)
           return nil, err
        }
        log.Println(fmt.Sprintf("No of rows retrieved: %v", len(nl.Value)))
        start = time.Now()
    }
}

Authentication

The plugin accepts authentication creating a secure dialer where credentials are setted. If the server where are you trying to connect needs authentication and you do not provide the credentials the complement will panic.

package main

import (
    "fmt"
    "log"

    "github.com/schwartzmx/gremtune"
)

func main() {
    errs := make(chan error)
    go func(chan error) {
        err := <-errs
        log.Fatal("Lost connection to the database: " + err.Error())
    }(errs) // Example of connection error handling logic

    dialer := gremtune.NewSecureDialer("127.0.0.1:8182", "username", "password") // Returns a WebSocket dialer to connect to Gremlin Server
    g, err := gremtune.Dial(dialer, errs) // Returns a gremtune client to interact with
    if err != nil {
        fmt.Println(err)
        return
    }
    res, err := g.Execute( // Sends a query to Gremlin Server
        "g.V('1234')"
    )
    if err != nil {
        fmt.Println(err)
        return
    }
    j, err := json.Marshal(res[0].Result.Data) // res will return a list of resultsets,  where the data is a json.RawMessage
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    fmt.Printf("%s", j)
}

License

See LICENSE

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].