【neo4j】Golangでサンプルノードを作成してみる【Golang】

2月 12, 2022

どもども、七分袖大好きsaisaiです。


みなさん、グラフDBは使用されておりますでしょうか。お恥ずかしい話、僕は最近まで一度も触ったことがありませんでした。


とにかく、何か触ってみようと思い最近噂のつよつよグラフDBである"neo4j"を触ってみることにしたのです。


インストールし初期設定やノードの作成、リレーションの作成などGUI上で行っていたのですが、プログラム上での操作方法も知っておきたかったのでGolangからサンプルノードを作成してみることにしました。


手順としては以下のページの通りですが、日本語の情報が現状全然見当たらないので記事に残しておくことにしました。

https://neo4j.com/developer/go/


それでは、実際にやってみます。

事前準備

まずはneo4jを立ち上げ、接続しておきましょう。

$ neo4j start
$ open http://localhost:7474

今回の処理に向けて必要な情報が以下の3つです。

・neo4jにログインするユーザー名
・neo4jにログインするパスワード
・neo4jに接続するuri

ユーザー名とパスワードはneo4jにログインする際に使用するもので問題ありません。


uriはneo4jのGUI上で確認することができます。localhost以降には接続先ポート番号が記載されているはずです。

これらの情報をあらかじめ確認しておいてください。

ノードを作成してみる

まずは作業ディレクトリを作成し、mod initしておきましょう。今回はディレクトリ名をgoNeo4jとしました。

$ mkdir goNeo4j
$ cd goNeo4j
$ go mod init goNeo4j

main.goファイルを作成します。先ほど紹介したページを参考にコードが動く状態にしました。

package main

import (
  "fmt"
	"github.com/neo4j/neo4j-go-driver/v4/neo4j"
) 


func helloWorld(uri, username, password string) (string, error) {
	driver, err := neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, ""))
	if err != nil {
		return "", err
	}
	defer driver.Close()

	session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite})
	defer session.Close()

	greeting, err := session.WriteTransaction(func(transaction neo4j.Transaction) (interface{}, error) {
		result, err := transaction.Run(
			"CREATE (a:Greeting) SET a.message = $message RETURN a.message + ', from node ' + id(a)",
			map[string]interface{}{"message": "hello, world"})
		if err != nil {
			return nil, err
		}

		if result.Next() {
			return result.Record().Values[0], nil
		}

		return nil, result.Err()
	})
	if err != nil {
		return "", err
	}

	return greeting.(string), nil
}

func main(){
	trunsctionResult, err := helloWorld("<先ほど確認したuri>","<ユーザー名>","<パスワード>")
	fmt.Println(trunsctionResult,err)
}

上記のコードのうち

CREATE (a:Greeting) SET a.message = $message RETURN a.message + ', from node ' + id(a)

こちらが実際にneo4jに接続して実行するCipher Queryになります。Greetingノードを作成し、変数(キー)massageに指定された名前のデータを挿入します。

今回の場合は"hello, world"というデータになりますね。

map[string]interface{}{"message": "hello, world"})

これでコードの準備も完了です。

実行してみる

それでは実際に実行してみましょう。

$go run main.go
go: finding module for package github.com/neo4j/neo4j-go-driver/v4/neo4j
go: downloading github.com/neo4j/neo4j-go-driver v1.8.3
go: downloading github.com/neo4j/neo4j-go-driver/v4 v4.3.2
hello, world, from node 0 <nil>

golangでneo4jに接続するために今回はNeo4jGoドライバーを使用しています。そのため初回実行時にはそのために必要なモジュールがインストールされています。


最終行で実際に作成されたノードとデータの情報が返ってきているので無事作成されていそうです。


実際にGUI上で確認してみると

無事ノードが作成され、データが入っている状態であることがわかります!目的達成です!

最後に

今回はGolang×neo4jということで実際に触ってみました。


neo4jはデータ同士の関係性が視覚的に確認できたり、joinしまくりのデータに対応できたりと今グイグイきているグラフDBなのでこれを機にどんどん触っていきたいと思います。


RDBとすこし勘所が違うので、実際にプロダクトに使用するにはまだまだ修行が必要そうですが…。


最後まで読んでいただきありがとうございました!


↓オススメ教材

Golang

Posted by CY