Значения, которые вы указываете после 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
})