2013-07-23 26 views
0

給定一個節點,我想查詢該節點的任何傳入關係並返回具有該關係的節點。我正在修改Node Neoj4 Template如何從Node.js中的Cypher查詢檢索非空白對象

我期待收回節點數組,爲每個元素創建對象,然後引用節點屬性。相反,我找回空物體。然而,我確實得到了正確的查詢節點數(即2個入站關係,返回2個元素)。

我已經在cypher shell中運行了查詢,並得到了我期望的結果。我正在使用Neo4j 1.9.2

關於圖表: 我有一個由8個People節點和2個關係類型組成的族譜圖:INHERITS_X,INHERITS_Y。這是指決定性別的染色體。例如,如果我有兩個孩子,那麼我有兩個傳入關係;我的兒子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功能:

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.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); 
     }); 

}; 

輸出

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查詢結果永遠只是數組節點 - 它們是結果的數組,其中「resu lt「是對應的(node/rel/path/etc。)對象的變量名字典。

因此,在你的榜樣,您的Cypher查詢說RETURN m,所以在你的for循環,你需要訪問results[i]['m'],不只是results[i]

希望這會有所幫助。

+0

順便說一下,從每個結果中「拔除」m節點很容易通過ES5的Array.prototype.map來完成,例如, 'results.map(function(res){return res ['m'];})'。使用Underscore.js更簡單:'_(results).pluck('m')'。 (http://underscorejs.org/#pluck) –

+0

啊哈!我知道我錯過了一些基本的東西。現在就像魅力一樣。非常感謝您回答並創建模板應用程序! –

相關問題