试图解释Node-Neo4j API

时间:2014-06-12 23:50:39

标签: json node.js object neo4j

我对编码很陌生,所以如果我的代码不可读或我的问题过于简单,请原谅我。

我正在尝试创建一个小服务器应用程序,其中(除其他外)显示neo4j节点的属性。我正在使用node.js,Express和Aseem Kishore的Node-Neo4j REST API客户端,可以找到其文档here.

我的问题源于我无法获取节点和路径的属性。我可以返回一个节点或路径,但它们似乎充满了我无法与之交互的对象。我倾注了API文档,寻找一些如何调用特定方法的例子,但我一无所获。

我一直试图调用#toJSON方法," db.toJSON(neoNode);"但它告诉我db不包含该方法。我也试过了," var x = neoNode.data"但它返回undefined。

有人可以帮我解决这个问题吗?

//This file accepts POST data to the "queryanode" module
//and sends it to "talkToNeo" which queries the neo4j database.
//The results are sent to "resultants" where they are posted to
//a Jade view. Unfortuantly, the data comes out looking like 
// [object Object] or a huge long string, or simply undefined.



var neo4j = require('neo4j');
var db = new neo4j.GraphDatabase('http://localhost:7474');



function resultants(neoNode, res){
    // if I console.log(neoNode) here, I now get the 4 digit integer
    // that Neo4j uses as handles for nodes. 
    console.log("second call of neoNode" + neoNode);
    var alpha = neoNode.data; //this just doesn't work
    console.log("alpha is: " +alpha); //returns undefined
    var beta = JSON.stringify(alpha);

    console.log("logging the node: ");
    console.log(beta);// still undefined
    res.render("results",{path: beta});
    res.end('end');

}


function talkToNeo (reqnode, res) {
    var params = {
    };
    var query = [
    'MATCH (a {xml_id:"'+ reqnode +'"})',
    'RETURN (a)' 
    ].join('\n');
    console.log(query);

    db.query(query, params, function (err, results) {
        if (err) throw err;

        var neoNode = results.map(function (result){
            return result['a']; //this returns a long string, looks like an array,
                                //but the values cannot be fetched out
        });
        console.log("this is the value of neoNode");
        console.log(neoNode);
        resultants(neoNode, res);
    });

};


exports.queryanode = function (req, res) {
    console.log('queryanode called');
    if (req.method =='POST'){
        var reqnode = req.body.node;    //this works as it should, the neo4j query passes in
        talkToNeo(reqnode, res)         //the right value.
    }
}

修改

嘿,我只是想回答我自己的问题,任何人用google搜索节点,neo4j,数据或"我如何获得neo4j属性?"

来自neo4j的巨大物体,当你按字母顺序排列时,你到处都有"http://localhost:7474/db/data/node/7056/whatever"个网址,这就是JSON。您可以使用自己的表示法查询它。您可以将变量设置为属性的值,如下所示:

var alpha = unfilteredResult[0]["nodes(p)"][i]._data.data;

处理这个JSON可能很困难。如果你像我一样,这个对象比任何互联网示例都可以为你准备的东西更复杂。您可以通过JSON Viewer,来查看结构,但重要的是有时会有一个额外的,未命名的顶层到该对象。这就是为什么我们用方括号表示法调用第0层的原因:unfilteredResult[0]该行的其余部分混合了方形和点符号,但它有效。这是一个函数的最终代码,它计算两个节点之间的最短路径并通过它循环。最终变量将传递到Jade视图中。

function talkToNeo (nodeone, nodetwo, res) {
    var params = {
    };
    var query = [
    'MATCH (a {xml_id:"'+ nodeone +'"}),(b {xml_id:"' + nodetwo + '"}),',
    'p = shortestPath((a)-[*..15]-(b))',
    'RETURN nodes(p), p' 
    ].join('\n');
    console.log("logging the query" +query);


    db.query(query, params, function (err, results) {
        if (err) throw err;
        var unfilteredResult = results;


        var neoPath = "Here are all the nodes that make up this path: ";
        for( i=0; i<unfilteredResult[0]["nodes(p)"].length; i++) {
            neoPath += JSON.stringify(unfilteredResult[0]['nodes(p)'][i]._data.data);
        }  


        var pathLength = unfilteredResult[0].p._length;
        console.log("final result" + (neoPath));
        res.render("results",{path: neoPath, pathLength: pathLength});
        res.end('end');

    });

};

1 个答案:

答案 0 :(得分:0)

我建议您查看我们针对Neo4j 2.0更新的示例应用程序 它使用Cypher加载数据和Node-labels来为Javascript类型建模。

您可以在此处找到它:https://github.com/neo4j-contrib/node-neo4j-template

看完后再问一些问题。