golang Neo4j图数据库REST API操作插件库neo4j的使用

golang Neo4j图数据库REST API操作插件库neo4j的使用

概述

这是一个用于与Neo4j REST API通信的Golang客户端库实现。

安装

使用以下命令安装neo4j库:

go get github.com/siesta/neo4j

示例用法

节点(Node)操作示例

// 创建Neo4j连接
neo4jConnection := Connect("")

// 创建节点对象
node := &Node{}
node.Id = "2229" // 设置节点ID

// 获取节点信息
err := neo4jConnection.Get(node)
if err != nil {
    fmt.Println("获取节点失败:", err)
    return
}

// 打印节点信息
fmt.Println(node)

关系(Relationship)操作示例

// 创建Neo4j连接
neo4jConnection := Connect("")

// 创建关系对象
rel := &Relationship{}
rel.Id = "2412" // 设置关系ID

// 获取关系信息
err := neo4jConnection.Get(rel)
if err != nil {
    fmt.Println("获取关系失败:", err)
    return
}

// 关系信息已存储在rel对象中

完整示例

下面是一个完整的示例,展示如何连接Neo4j并操作节点和关系:

package main

import (
    "fmt"
    "github.com/siesta/neo4j"
)

func main() {
    // 1. 连接到Neo4j数据库
    // 参数为空字符串表示使用默认连接设置
    neo4jConnection := neo4j.Connect("")
    
    // 2. 节点操作示例
    nodeExample(neo4jConnection)
    
    // 3. 关系操作示例
    relationshipExample(neo4jConnection)
}

func nodeExample(conn *neo4j.Connection) {
    fmt.Println("=== 节点操作示例 ===")
    
    // 创建新节点
    newNode := &neo4j.Node{
        Data: map[string]interface{}{
            "name":  "示例节点",
            "value": 42,
        },
    }
    
    // 保存节点到数据库
    err := conn.Create(newNode)
    if err != nil {
        fmt.Println("创建节点失败:", err)
        return
    }
    fmt.Printf("创建节点成功,ID: %s\n", newNode.Id)
    
    // 获取节点信息
    nodeToGet := &neo4j.Node{Id: newNode.Id}
    err = conn.Get(nodeToGet)
    if err != nil {
        fmt.Println("获取节点失败:", err)
        return
    }
    fmt.Printf("获取到的节点数据: %+v\n", nodeToGet)
}

func relationshipExample(conn *neo4j.Connection) {
    fmt.Println("\n=== 关系操作示例 ===")
    
    // 创建两个节点作为关系的起点和终点
    node1 := &neo4j.Node{Data: map[string]interface{}{"name": "节点1"}}
    node2 := &neo4j.Node{Data: map[string]interface{}{"name": "节点2"}}
    
    conn.Create(node1)
    conn.Create(node2)
    
    // 创建关系
    newRel := &neo4j.Relationship{
        Type:   "KNOWS",  // 关系类型
        Start:  node1.Id, // 起始节点ID
        End:    node2.Id, // 结束节点ID
        Data:   map[string]interface{}{"since": "2023"},
    }
    
    // 保存关系到数据库
    err := conn.Create(newRel)
    if err != nil {
        fmt.Println("创建关系失败:", err)
        return
    }
    fmt.Printf("创建关系成功,ID: %s\n", newRel.Id)
    
    // 获取关系信息
    relToGet := &neo4j.Relationship{Id: newRel.Id}
    err = conn.Get(relToGet)
    if err != nil {
        fmt.Println("获取关系失败:", err)
        return
    }
    fmt.Printf("获取到的关系数据: %+v\n", relToGet)
}

这个示例展示了如何:

  1. 连接到Neo4j数据库
  2. 创建节点并设置属性
  3. 获取节点信息
  4. 创建节点之间的关系
  5. 获取关系信息

注意:实际使用时需要根据你的Neo4j服务器配置调整连接参数。


更多关于golang Neo4j图数据库REST API操作插件库neo4j的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Neo4j图数据库REST API操作插件库neo4j的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Golang操作Neo4j图数据库:neo4j-go-driver详解

Neo4j是一个流行的图数据库,而Golang社区提供了neo4j-go-driver库来方便地与Neo4j交互。下面我将详细介绍如何使用这个驱动库。

1. 安装驱动

首先安装neo4j-go-driver:

go get github.com/neo4j/neo4j-go-driver/v5

2. 基本连接与操作

2.1 建立连接

package main

import (
	"fmt"
	"log"

	"github.com/neo4j/neo4j-go-driver/v5/neo4j"
)

func main() {
	// Neo4j连接配置
	uri := "bolt://localhost:7687"
	username := "neo4j"
	password := "password"

	// 创建驱动
	driver, err := neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, ""))
	if err != nil {
		log.Fatal(err)
	}
	defer driver.Close()

	// 获取会话
	session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite})
	defer session.Close()

	// 执行Cypher查询
	result, err := session.Run(
		"CREATE (n:Person {name: $name, age: $age}) RETURN n",
		map[string]interface{}{"name": "Alice", "age": 30},
	)
	if err != nil {
		log.Fatal(err)
	}

	// 处理结果
	if result.Next() {
		node := result.Record().Values[0].(neo4j.Node)
		fmt.Printf("Created node with ID: %d\n", node.Id)
	}
}

2.2 查询数据

func queryPersons(driver neo4j.Driver) {
	session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeRead})
	defer session.Close()

	result, err := session.Run(
		"MATCH (p:Person) WHERE p.age > $age RETURN p.name, p.age",
		map[string]interface{}{"age": 25},
	)
	if err != nil {
		log.Fatal(err)
	}

	for result.Next() {
		record := result.Record()
		name, _ := record.Get("p.name")
		age, _ := record.Get("p.age")
		fmt.Printf("Name: %s, Age: %d\n", name, age)
	}
}

3. 高级操作

3.1 事务处理

func createFriendship(driver neo4j.Driver, person1, person2 string) error {
	session := driver.NewSession(neo4j.SessionConfig{})
	defer session.Close()

	_, err := session.WriteTransaction(func(tx neo4j.Transaction) (interface{}, error) {
		// 创建两个人和他们之间的关系
		_, err := tx.Run(
			"MERGE (a:Person {name: $name1}) "+
				"MERGE (b:Person {name: $name2}) "+
				"MERGE (a)-[:FRIEND]->(b)",
			map[string]interface{}{"name1": person1, "name2": person2},
		)
		return nil, err
	})
	return err
}

3.2 批量操作

func batchCreatePersons(driver neo4j.Driver, persons []map[string]interface{}) error {
	session := driver.NewSession(neo4j.SessionConfig{})
	defer session.Close()

	_, err := session.WriteTransaction(func(tx neo4j.Transaction) (interface{}, error) {
		for _, person := range persons {
			_, err := tx.Run(
				"CREATE (p:Person {name: $name, age: $age, city: $city})",
				person,
			)
			if err != nil {
				return nil, err
			}
		}
		return nil, nil
	})
	return err
}

4. 使用REST API

如果你确实需要使用REST API而不是Bolt协议,可以使用标准net/http包:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

type Neo4jQuery struct {
	Statements []Statement `json:"statements"`
}

type Statement struct {
	Statement  string                 `json:"statement"`
	Parameters map[string]interface{} `json:"parameters,omitempty"`
}

func main() {
	url := "http://localhost:7474/db/neo4j/tx/commit"
	username := "neo4j"
	password := "password"

	query := Neo4jQuery{
		Statements: []Statement{
			{
				Statement: "MATCH (n:Person) RETURN n LIMIT 5",
			},
		},
	}

	jsonData, err := json.Marshal(query)
	if err != nil {
		fmt.Println(err)
		return
	}

	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println(err)
		return
	}

	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/json")
	req.SetBasicAuth(username, password)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}

5. 最佳实践

  1. 连接池管理:neo4j-go-driver内置了连接池,通常不需要手动管理
  2. 参数化查询:总是使用参数化查询防止Cypher注入
  3. 资源清理:确保关闭Session和Driver
  4. 错误处理:正确处理所有可能的错误
  5. 批量操作:对于大量数据,考虑使用UNWIND进行批量操作

6. 性能优化

// 使用UNWIND进行批量操作更高效
func batchCreateOptimized(driver neo4j.Driver, persons []map[string]interface{}) error {
	session := driver.NewSession(neo4j.SessionConfig{})
	defer session.Close()

	_, err := session.Run(
		"UNWIND $persons AS person "+
			"CREATE (p:Person) SET p = person",
		map[string]interface{}{"persons": persons},
	)
	return err
}

neo4j-go-driver提供了完整的Neo4j功能支持,建议优先使用Bolt协议而非REST API,因为性能更好。对于大多数应用场景,上述示例已经足够使用。

回到顶部