Categorygithub.com/thingful/neoism
modulepackage
1.3.1
Repository: https://github.com/thingful/neoism.git
Documentation: pkg.go.dev

# README

neoism - Neo4j client for Go

Neoism Logo

Package neoism is a Go client library providing access to the Neo4j graph database via its REST API.

Status

Build Status Build Status Circle CI Coverage Status

This driver is fairly complete, and may now be suitable for general use. The code has an extensive set of integration tests, but little real-world testing. YMMV; use in production at your own risk.

Requirements

Go 1.1 or later is required.

Tested against Neo4j 2.2.4 and Go 1.4.1.

Installation

go get -v github.com/jmcvetta/neoism

Documentation

See GoDoc or Go Walker for automatically generated documentation.

Usage

Connect to Neo4j Database

db, err := neoism.Connect("http://localhost:7474/db/data")

Create a Node

n, err := db.CreateNode(neoism.Props{"name": "Captain Kirk"})

Issue a Cypher Query

// res will be populated with the query results.  It must be a slice of structs.
res := []struct {
		// `json:` tags matches column names in query
		A   string `json:"a.name"` 
		Rel string `json:"type(r)"`
		B   string `json:"b.name"`
	}{}

// cq holds the Cypher query itself (required), any parameters it may have 
// (optional), and a pointer to a result object (optional).
cq := neoism.CypherQuery{
	// Use backticks for long statements - Cypher is whitespace indifferent
	Statement: `
		MATCH (a:Person)-[r]->(b)
		WHERE a.name = {name}
		RETURN a.name, type(r), b.name
	`,
	Parameters: neoism.Props{"name": "Dr McCoy"},
	Result:     &res,
}

// Issue the query.
err := db.Cypher(&cq)

// Get the first result.
r := res[0]

Issue Cypher queries with a transaction

tx, err := db.Begin(qs)
if err != nil {
  // Handle error
}

cq0 := neoism.CypherQuery{
  Statement: `MATCH (a:Account) WHERE a.uuid = {account_id} SET balance = balance + {amount}`,
  Parameters: neoism.Props{"uuid": "abc123", amount: 20},
}
err = db.Cypher(&cq0)
if err != nil {
  // Handle error
}

cq1 := neoism.CypherQuery{
  Statement: `MATCH (a:Account) WHERE a.uuid = {account_id} SET balance = balance + {amount}`,
  Parameters: neoism.Props{"uuid": "def456", amount: -20},
}
err = db.Cypher(&cq1)
if err != nil {
  // Handle error
}

err := tx.Commit()
if err != nil {
  // Handle error
}

Roadmap

Completed:

  • Node (create/edit/relate/delete/properties)
  • Relationship (create/edit/delete/properties)
  • Legacy Indexing (create/edit/delete/add node/remove node/find/query)
  • Cypher queries
  • Batched Cypher queries
  • Transactional endpoint (Neo4j 2.0)
  • Node labels (Neo4j 2.0)
  • Schema index (Neo4j 2.0)
  • Authentication (Neo4j 2.2)

To Do:

  • Streaming API support - see Issue #22
  • Unique Indexes - probably will not expand support for legacy indexing.
  • Automatic Indexes - "
  • High Availability
  • Traversals - May never be supported due to security concerns. From the manual: "The Traversal REST Endpoint executes arbitrary Groovy code under the hood as part of the evaluators definitions. In hosted and open environments, this can constitute a security risk."
  • Built-In Graph Algorithms
  • Gremlin

Testing

Neoism's test suite respects, but does not require, a NEO4J_URL environment variable. By default it assumes Neo4j is running on localhost:7474, with username neo4j and password foobar.

export NEO4J_URL=http://your_user:[email protected]/db/data/
go test -v .

If you are using a fresh untouched Neo4j instance, you can use the included set_neo4j_password.sh script to set the password to that expected by Neoism's tests:

sh set_neo4j_password.sh

Contributing

Contributions, in the form of Pull Requests or Issues, are gladly accepted. Before submitting a Pull Request, please ensure your code passes all tests, and that your changes do not decrease test coverage. I.e. if you add new features, also add corresponding new tests.

For fastest response when submitting an Issue, please create a failing test case to demonstrate the problem.

License

This is Free Software, released under the terms of the GPL v3.

# Packages

No description provided by the author

# Functions

Connect setups parameters for the Neo4j server and calls ConnectWithRetry().
PropertyKeys lists all property keys ever used in the database.

# Variables

One of these errors is returned if we receive an error or unexpected response from the server.
One of these errors is returned if we receive an error or unexpected response from the server.
One of these errors is returned if we receive an error or unexpected response from the server.
One of these errors is returned if we receive an error or unexpected response from the server.
A TxQueryError is returned when there is an error with one of the Cypher queries inside a transaction, but not with the transaction itself.

# Structs

A CypherQuery is a statement in the Cypher query language, with optional parameters and result.
A Database is a REST client connected to a Neo4j database.
An Index improves the speed of looking up nodes in the database.
A LegacyNodeIndex is a searchable index for nodes.
A LegacyRelationshipIndex is an index for searching Relationships.
A NeoError is populated by api calls when there is an error.
A Node is a node, with optional properties, in a graph.
A Relationship is a directional connection between two Nodes, with an optional set of arbitrary properties.
No description provided by the author
A Tx is an in-progress database transaction.
A TxError is an error with one of the statements submitted in a transaction, but not with the transaction itself.
A UniqueConstraint makes sure that your database will never contain more than one node with a specific label and one property value.

# Type aliases

A Props is a set of key/value properties.
A Rels is a collection of relationships.