我正在开发一个使用 neo4j 数据库的 Go 项目。我不完全了解如何处理查询结果。
在下面,这是我设法工作的代码,但我想要 return user
而不是 return user.email as email, user.pseudo as pseudo
。这里我有 2 个返回值,但是如果我有 10 个以上的值要返回怎么办...我不确定,我做得对。
data, err := session.ReadTransaction(func(tx neo4j.Transaction)(interface{}, error) {
res, err := tx.Run(
`match (user:User) where user.email = $email
return user.email as email, user.pseudo as pseudo`,
map[string]interface{}{"email": email})
if err != nil {
return nil, err
}
if res.Next() {
if pseudo, found := res.Record().Get("pseudo"); found {
userData.Pseudo = pseudo.(string)
}
if email, found := res.Record().Get("email"); found {
userData.Email = email.(string)
}
return userData, nil
}
return nil, nil
})
事实是,当我返回 user := res.Record().Values()[0]
而不是 res.Record().Get("something")
时,我得到了一个接口,但我不知道如何提取指定 id 的数据,如 user.email
。
fmt.Printf("%t", user)
给出 &{%!t(*types.Node=&{0 [User] map[email:testman@mail.com pseudo:testman]})}
。
**更新
data, err := session.ReadTransaction(func(tx neo4j.Transaction)(interface{}, error) {
res, err := tx.Run(`MATCH (user:User) WHERE user.email = $email RETURN user`, map[string]interface{}{"email": email})
if err != nil {
return nil, err
}
if res.Next() {
record, err := res.Single()
if err != nil {
fmt.Printf("%s\n", err.Error())
return nil, err
}
userRecord, found := record.Get("user")
if !found {
return nil, errors.New("User not found")
}
userAttributes := userRecord.(map[string]interface{})
userData.Email = userAttributes["email"].(string)
return userData, nil
}
return nil, nil
})
答案 0 :(得分:0)
欢迎!
如果您的查询以 RETURN user
结尾并且您似乎想要一个结果,您可以这样写:
record, err := res.Single()
// [...] check err
userRecord, err := record.Get("user")
// [...] check err
userAttributes := userRecord.(dbtype.Node).Props // 1st cast record into node and extract properties
userData.pseudo := userAttributes["pseudo"].(string) // then cast each property value to expected type
// ...