Как получить непустые объекты из Cypher Query в Node.js

Учитывая узел, я хочу запросить любые входящие отношения для этого узла и вернуть узлы, которые имеют эти отношения. Я модифицирую шаблон Node Neoj4

Я ожидаю получить обратно массив узлов, создать объекты для каждого элемента и затем ссылаться на свойства узлов. Вместо этого я возвращаю пустые предметы. Я, однако, получить правильное количество узлов для запроса (то есть 2 входящих отношений, возвращает 2 элемента).

Я запустил запрос в оболочке cypher и получил ожидаемые результаты. Я использую Neo4j 1.9.2

О графике: у меня есть генеалогический граф, состоящий из 8 человек-узлов и двух типов отношений: INHERITS_X, INHERITS_Y. Это относится к хромосомам, которые определяют пол. Например, если у меня двое детей, то у меня 2 входящих отношения; мой сын INHERITS_Y и моя дочь INHERITS_X.

Любая помощь приветствуется.

Спасибо,

Вот где вызывается функция запроса (getInbound):

exports.show = function (req, res, next) {
    Person.get(req.params.id, function (err, person) {
      if (err) return next(err);
      person.getInbound(function (err, inbound) {
      res.render('person', {
              person: person
      })
      })
})

};

И функция getInbound:

Person.prototype.getInbound = function(callback) {
        var query = ['START p=node({ID})',
                     'MATCH p <-[:INHERITS_Y|INHERITS_X]- m',
                     'RETURN m'
        ].join('\n');

        var params = {
          ID: this.id,
          NAME: this.name
        };

        console.log("In getInbound function");
        console.log("this.name is  ",this.name);
        var in_nodes = [];

       db.query(query, params, function (err, results) {
               console.log("Error from the query ",err);
            if (err) return callback(err);
            console.log("Number of elements in array returned from query: ", results.length);
            for (var i=0; i< results.length; i++) {
                    console.log(" In the for loop, var i = ",i);
               var in_node = new Person(results[i]);
               console.log("New Person object created  from array element ", in_node);
               in_nodes.push(in_node);
              }
             callback(null, in_nodes);
         });

};

Выход из запуска кода:

Express server listening on port 5000 
GET /persons 304 77ms 
IN getInbound - this.name is  Eddie Dickey 

Error from the query  null

results length returned from query:  2  

In the for loop, var i =  0 
Creating a new Person object form each element of array returned from query { _node: { m: { db: [Object], _request: [Object], _data: [Object] } } }  

In the for loop, var i =  1 
Creating a new Person object form each element of array returned from query { _node: { m: { db: [Object], _request: [Object], _data: [Object] } } } GET /persons/0 200 21ms - 602b

И конструктор Person:

var Person = module.exports = function Person(_node) {
    // all we'll really store is the node; the rest of our properties will be
    // derivable or just pass-through properties (see below).

    this._node = _node;
}

1 ответ

Решение

Результаты запросов Cypher никогда не являются просто массивом узлов - они представляют собой массив результатов, где "результат" - это словарь имени переменной для соответствующего объекта (node ​​/rel/path/etc.).

Итак, в вашем примере ваш запрос Cypher говорит RETURN mтак в вашем for петля, вам нужно получить доступ results[i]['m'], не просто results[i],

Надеюсь это поможет.

Другие вопросы по тегам