nebula-go,数据入库ExecuteWithParameter报错ErrorCode: -1005

nebula 版本: 3.1.0
安装方式:docker-compose
nebula-go版本:v3.4.0

下面的代码使用了nebula-go库,功能为将一个map[string]interface{}类型的对象通过ExecuteWithParameter函数存储入库到nebulagraph数据库。

现在这段代码执行过程中遇到了一个bug:ErrorCode: -1005, ErrorMsg: Storage Error: The data type does not meet the requirements. Use the correct type of data.

func AddVertex(ptrPool *nebula.ConnectionPool) error {
	// Create session
	session, err := ptrPool.GetSession(username, password)
	if err != nil {
		log.Fatal(fmt.Sprintf("Fail to create a new session from connection pool, "+
			"username: %s, password: %s, %s", username, password, err.Error()))
		return err
	}
	// Release session and return connection back to connection pool
	defer session.Release()

	personMap := make(map[string]interface{})
	personMap["Height"] = 1.78
	personMap["Name"] = "asd"

	insertNGQL := ` 
		CREATE SPACE IF NOT EXISTS Myspace(vid_type=FIXED_STRING(20));
		USE Myspace;

		CREATE TAG IF NOT EXISTS Person (Height double null, Name string null);

		INSERT VERTEX Person (Height, Name)
		VALUES
		"aaaaaaaaaaaaaaaaaaaa":($Height, $Name);
	`

	_, _ = session.Execute("USE Myspace;")

	// Send
	resultSet, err := session.ExecuteWithParameter(insertNGQL, personMap)
	if err != nil {
		fmt.Print(err.Error())
		return err
	}
	checkResultSet("test", resultSet)

	return nil
}

请问各位大佬看看这个问题该如何解决?

检查下参数值和属性类型是否一致。

(root@nebula) [nba]> :param p1=>"1"
(root@nebula) [nba]> :param p2=>3.4
(root@nebula) [nba]> insert vertex player values "1":($p1,$p2)
Execution succeeded (time spent 1908/2207 us)

(root@nebula) [nba]> insert vertex player(name, age) values "1":("1",3.4)
Execution succeeded (time spent 1981/2241 us)

(root@nebula) [nba]> desc tag player
+--------+----------+-------+---------+---------+
| Field  | Type     | Null  | Default | Comment |
+--------+----------+-------+---------+---------+
| "name" | "string" | "YES" |         |         |
| "age"  | "int64"  | "YES" |         |         |
+--------+----------+-------+---------+---------+
Got 2 rows (time spent 2133/2516 us)

(root@nebula) [nba]> :param p2=>"3.4"
(root@nebula) [nba]> insert vertex player(name, age) values "1":("1","3.4")
[ERROR (-1005)]: Storage Error: The data type does not meet the requirements. Use the correct type of data.

(root@nebula) [nba]> insert vertex player(name,age) values "1":($p1,$p2)
[ERROR (-1005)]: Storage Error: The data type does not meet the requirements. Use the correct type of data.

感谢您的回复,我在控制台中是可以执行成功的,但是用nebula-go在golang客户端中传入类型为map[stirng]interface{}的变量就不可以,我进入源码调试查看可以断定nebula-go是将map[stirng]interface{}的变量成功转为nebula-go中的类型,但是执行插入语句过程报上述错误,怀疑是nebula-go的问题

@TuoLe 是的,目前 nebula-go 还不支持这样写,可以 work 的写法可以参考下:

func prepareParameter() {
	// p1:true  p2:3  p3:[true,3]  p4:{"a":true,"b":"Bob"}
	params = make(map[string]*nebula.Value)
	var bVal bool = true
	var iVal int64 = 3
	p1 := nebula.Value{BVal: &bVal}
	p2 := nebula.Value{IVal: &iVal}
	p5 := nebula.Value{SVal: []byte("Bob")}
	lSlice := []*nebula.Value{&p1, &p2}
	var lVal nebula.NList
	lVal.Values = lSlice
	p3 := nebula.Value{LVal: &lVal}
	var nmap map[string]*nebula.Value = map[string]*nebula.Value{"a": &p1, "b": &p5}
	var mVal nebula.NMap
	mVal.Kvs = nmap
	p4 := nebula.Value{MVal: &mVal}
	params["p1"] = &p1
	params["p2"] = &p2
	params["p3"] = &p3
	params["p4"] = &p4
}

支持 map[string]interface{} 的话只需要做一个简单的类型转换再传入到 ExecuteWithParameter 接口即可,目前需要用户自己去做转换。感谢发现问题,你可以提 issue 或者帮我们贡献代码,可以参考下 nebula-java parameter value type transformation 的做法

@kyle
感谢您的回复,仍要和您请教,

目前看调用ExecuteWithParameter函数传入的形参params仍然要求是map[string]interface{},尽管map中的值已经是*nebula2.Vaule类型,仍然不能转换成功

    // ...

    // 准备传入的参数map
    var limitNum int64 = 5
    queryParamas := make(map[string]interface{})
    queryParamas["TagName"] = &nebula2.Value{SVal: []byte(" Employees")}
    queryParamas["LimitNum"] = &nebula2.Value{IVal: &limitNum}

    // 执行查询语句:仍然不起效果
    res, err := ptrSession.ExecuteWithParameter(
        "MATCH (v:($TagName)) return v limit ($LimitNum);", queryParamas)
    
    // ...

请您看看这一步该如何继续应用?

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。