嬴图的Go驱动是让用户可以在Go应用中与嬴图数据库进行交互的官方库。它支持Go 1.13或更高版本。
安装驱动
初始化Go模块后,将最新的嬴图Go驱动添加到依赖项中:
go get github.com/ultipa/ultipa-go-driver/v5@latest
连接数据库
为了使用驱动,需要有一个处于活跃状态的嬴图数据库。创建一个数据库实例最简单的方法是通过嬴图Cloud(提供免费试用)。当然也可以使用私有部署的嬴图数据库。
连接数据库并测试连接是否成功:
package main
import (
"log"
"github.com/ultipa/ultipa-go-driver/v5/sdk"
"github.com/ultipa/ultipa-go-driver/v5/sdk/configuration"
)
func main() {
config := &configuration.UltipaConfig{
// URI example: Hosts: []string{"xxxx.us-east-1.cloud.ultipa.cn:60010"},
Hosts: []string{"10.xx.xx.xx:60010"},
Username: "<username>",
Password: "<password>",
}
driver, err := sdk.NewUltipaDriver(config)
if err != nil {
log.Fatalln("Failed to connect to Ultipa:", err)
}
// Tests the connection
isSuccess, _ := driver.Test(nil)
println("Connection succeeds:", isSuccess)
}
Connection succeeds: true
查询数据库
GQL是国际标准化的图数据库查询语言。你可以使用驱动的Gql()
方法发送GQL语句来全方位操作数据库。如果还不熟悉GQL,可以阅读GQL快速入门,或者更详细的GQL文档。
创建一个图
在数据库中新建一个图:
package main
import (
"fmt"
"log"
"github.com/ultipa/ultipa-go-driver/v5/sdk"
"github.com/ultipa/ultipa-go-driver/v5/sdk/configuration"
)
func main() {
config := &configuration.UltipaConfig{
// URI example: Hosts: []string{"xxxx.us-east-1.cloud.ultipa.cn:60010"},
Hosts: []string{"10.xx.xx.xx:60010"},
Username: "<username>",
Password: "<password>",
}
driver, err := sdk.NewUltipaDriver(config)
if err != nil {
log.Fatalln("Failed to connect to Ultipa:", err)
}
// Creates a new open graph named 'g1'
response, _ := driver.Gql("CREATE GRAPH g1 ANY", nil)
fmt.Println(response.Status.Code)
}
SUCCESS
插入点和边
向图中插入点和边:
package main
import (
"fmt"
"log"
"github.com/ultipa/ultipa-go-driver/v5/sdk"
"github.com/ultipa/ultipa-go-driver/v5/sdk/configuration"
)
func main() {
config := &configuration.UltipaConfig{
// URI example: Hosts: []string{"xxxx.us-east-1.cloud.ultipa.cn:60010"},
Hosts: []string{"10.xx.xx.xx:60010"},
Username: "<username>",
Password: "<password>",
DefaultGraph: "g1", // Sets the default graph to 'g1'
}
driver, err := sdk.NewUltipaDriver(config)
if err != nil {
log.Fatalln("Failed to connect to Ultipa:", err)
}
// Inserts nodes and edges into graph the 'g1'
response, _ := driver.Gql(`INSERT
(u1:User {_id: 'U1', name: 'rowlock'}),
(u2:User {_id: 'U2', name: 'Brainy'}),
(u3:User {_id: 'U3', name: 'purplechalk'}),
(u4:User {_id: 'U4', name: 'mochaeach'}),
(u5:User {_id: 'U5', name: 'lionbower'}),
(u1)-[:Follows {createdOn: DATE('2024-01-05')}]->(u2),
(u4)-[:Follows {createdOn: DATE('2024-02-10')}]->(u2),
(u2)-[:Follows {createdOn: DATE('2024-02-01')}]->(u3),
(u3)-[:Follows {createdOn: DATE('2024-05-03')}]->(u5)`, nil)
fmt.Println(response.Status.Code)
}
SUCCESS
查询点
在图中查询点:
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/ultipa/ultipa-go-driver/v5/sdk"
"github.com/ultipa/ultipa-go-driver/v5/sdk/configuration"
)
func main() {
config := &configuration.UltipaConfig{
// URI example: Hosts: []string{"xxxx.us-east-1.cloud.ultipa.cn:60010"},
Hosts: []string{"10.xx.xx.xx:60010"},
Username: "<username>",
Password: "<password>",
DefaultGraph: "amz", // Optional; sets the default graph as 'amz'
}
driver, err := sdk.NewUltipaDriver(config)
if err != nil {
log.Fatalln("Failed to connect to Ultipa:", err)
}
// Retrieves 3 User nodes from the graph 'g1'
requestConfig := &configuration.RequestConfig{
Graph: "g1", // Sets the graph for the specific request as 'g1'
}
response, _ := driver.Gql("MATCH (u:User) RETURN u LIMIT 3", requestConfig)
nodes, _, _ := response.Alias("u").AsNodes()
for _, node := range nodes {
jsonData, err := json.MarshalIndent(node, "", " ")
if err != nil {
fmt.Println("Error:", err)
continue
}
fmt.Println(string(jsonData))
}
}
{
"ID": "U4",
"UUID": 6557243256474697731,
"Schema": "User",
"Values": {
"Data": {
"name": "mochaeach"
}
}
}
{
"ID": "U2",
"UUID": 7926337543195328514,
"Schema": "User",
"Values": {
"Data": {
"name": "Brainy"
}
}
}
{
"ID": "U5",
"UUID": 14771808976798482436,
"Schema": "User",
"Values": {
"Data": {
"name": "lionbower"
}
}
}
处理查询结果
驱动的Gql()
方法返回的Response
包含数据库返回的原始查询结果和执行信息。为了在应用中使用查询结果,你需要将其提取出来并转换成可用的数据结构。
上面的点查询示例中,使用Alias()
方法提取查询结果,再使用AsNodes()
方法将其转换为一个Node
列表:
// Retrieves 3 User nodes from the graph 'g1'
requestConfig := &configuration.RequestConfig{
Graph: "g1", // Sets the graph for the specific request as 'g1'
}
response, _ := driver.Gql("MATCH (u:User) RETURN u LIMIT 3", requestConfig)
nodes, _, _ := response.Alias("u").AsNodes()
for _, node := range nodes {
jsonData, err := json.MarshalIndent(node, "", " ")
if err != nil {
fmt.Println("Error:", err)
continue
}
fmt.Println(string(jsonData))
}
使用何种转换方法取决于查询结果的类型,比如点、边、路径、属性值等。用户可在此查看所有的转换方法和示例。
便捷方法
除了用于执行自定义GQL语句的Gql()
方法之外,驱动还提供了一系列便捷方法,以简化常见的数据库操作。这些方法让用户轻松执行以下类别的任务,无需编写完整的查询语句:
- 图:在数据库中获取、创建、修改或删除图。
- Schema和属性:定义和修改图中点和边的Schema以及属性。
- 数据插入:高效地向图中插图点和边。
- 查询加速:管理用于提高查询效率的索引和全文索引。
- HDC图和算法:管理HDC图并运行算法。
- 进程与作业:监控正在运行的进程,管理后台作业。
- 访问控制:配置用户权限和策略(角色)。
- 数据导出:导出图中的点和边。
例如,ShowGraph()
方法获取数据库中所有的图,它返回一个GraphSet
列表:
package main
import (
"log"
"github.com/ultipa/ultipa-go-driver/v5/sdk"
"github.com/ultipa/ultipa-go-driver/v5/sdk/configuration"
)
func main() {
config := &configuration.UltipaConfig{
// URI example: Hosts: []string{"xxxx.us-east-1.cloud.ultipa.cn:60010"},
Hosts: []string{"10.xx.xx.xx:60010"},
Username: "<username>",
Password: "<password>",
}
driver, err := sdk.NewUltipaDriver(config)
if err != nil {
log.Fatalln("Failed to connect to Ultipa:", err)
}
// Retrieves all graphs in the database
graphs, _ := driver.ShowGraph(nil)
for _, graph := range graphs {
println(graph.Name)
}
}
g1
miniCircle
amz
例如,InsertNodes()
方法向图中插入点,用户只需提供目标Schema名称以及一个Node
列表:
package main
import (
"fmt"
"log"
"github.com/ultipa/ultipa-go-driver/v5/sdk"
"github.com/ultipa/ultipa-go-driver/v5/sdk/configuration"
"github.com/ultipa/ultipa-go-driver/v5/sdk/structs"
)
func main() {
config := &configuration.UltipaConfig{
// URI example: Hosts: []string{"xxxx.us-east-1.cloud.ultipa.cn:60010"},
Hosts: []string{"10.xx.xx.xx:60010"},
Username: "<username>",
Password: "<password>",
}
driver, err := sdk.NewUltipaDriver(config)
if err != nil {
log.Fatalln("Failed to connect to Ultipa:", err)
}
// Inserts two User nodes into the graph 'g1'
requestConfig := &configuration.RequestConfig{Graph: "g1"}
insertRequestConfig := &configuration.InsertRequestConfig{RequestConfig: requestConfig}
nodes := []*structs.Node{
{
ID: "U6",
Values: &structs.Values{
Data: map[string]interface{}{
"name": "Alice",
"age": 28,
},
},
},
{
ID: "U7",
Values: &structs.Values{
Data: map[string]interface{}{
"name": "Quars",
},
},
},
}
response, _ := driver.InsertNodes("User", nodes, insertRequestConfig)
fmt.Println(response.Status.Code)
}
SUCCESS