如何处理结果

时间:2021-01-18 15:58:38

标签: go neo4j

我正在开发一个使用 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.emailfmt.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
    })

1 个答案:

答案 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 
    // ...