1 回答
TA贡献1797条经验 获得超6个赞
您在查询中指定的值return是从左到右索引的 0。因此,在您的示例中,由于您仅从MATCH(在本例中定义为n)返回一个值,因此它将在索引 0 处可用。如错误消息所示,索引一超出范围。
//in the following example a node has an id of type int64, name of type string, and value of float32
result, _ := session.Run(`
match(n) where n.id = 1 return n.id, n.name, n.value`, nil)
// index 0 ^ idx 1^ . idx 2^
for result.Next() {
a, ok := result.Record().GetByIndex(0).(int64) //n.id
// ok == true
b, ok := result.Record().GetByIndex(0).(string) //n.name
// ok == true
c, ok := result.Record().GetByIndex(0).(float64)//n.value
// ok == true
}
这可能是访问节点上属性值的惯用方式的基线——而不是尝试访问整个节点(驱动程序通过将 nodeValue 保留为未导出的结构隐式地阻止)从节点返回单个属性,如上例所示。
与驱动程序一起工作时需要考虑的其他几点。Result还公开了一种Get(key string) (interface{}, ok)通过返回值的名称访问结果的方法。这样,如果您需要更改结果的顺序,您的值提取代码将不会在尝试访问错误索引时中断。所以采取以上内容并稍微修改一下:
result, _ := session.Run(`
match(n) where n.id = 1 return n.id as nodeId, n.name as username, n.value as power`, nil)
for result.Next() {
record := result.Record()
nodeID, ok := record.Get("nodeId")
// ok == true and nodeID is an interface that can be asserted to int
username, ok := record.Get("username")
// ok == true and username is an interface that can be asserted to string
}
最后要指出的是map[string]interface{}可用于将值作为参数传递给查询。
session.Run("match(n) where n.id = $id return n",
map[string]interface{}{
"id": 1237892
})
- 1 回答
- 0 关注
- 110 浏览
添加回答
举报