Как разобрать результаты в официальном драйвере neo4j go? - PullRequest
0 голосов
/ 06 декабря 2018

У меня проблема с анализом результатов из neo4j-go-driver официального драйвера , когда запрос Cypher равен MATCH.С запросом CREATE, как в примере с README.md, работает нормально, но с MATCH не выполняет индексацию с результатом Record (). GetByIndex (0)

result, err = session.Run("match(n) where n.id = 1 return n", map[string]interface{}{})
if err != nil {
    panic(err)
}

for result.Next() {
    a := result.Record().GetByIndex(1)         //error: Index out or range
    b := result.Record().GetByIndex(0).(int64) //error: interface {} is *neo4j.nodeValue, not int64
    c := result.Record().GetByIndex(0) //prints corect result: &{14329224 [Item] map[id:1 name:Item 1]}
    fmt.Println(c)

}

Поскольку nodeValue не экспортируется, я не знаю, горячийк утвержденным атрибутам или всему интерфейсу обратно к типу nodeValue.

1 Ответ

0 голосов
/ 07 декабря 2018

Значения, которые вы указываете после 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
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...