可选匹配不返回结果

时间:2015-09-20 09:58:43

标签: node.js neo4j

当我在neo4j浏览器中触发此查询时(localhost:7474 / browser)

match (s:Song)
optional match (sg:SongGroup)-[r:SONGGROUP_SONG]->(s) where id(sg) = 294
return sg.title , s.title

...我明白了:( sg.title和s.title都有数据)

sg.title    s.title
test 3      Shake it off
....        .....

当我在nodejs中将相同的查询推送到此函数时(使用npm请求模块):

function cypherQuery(query, params, callback) {
  request.post({
      uri    : 'http://localhost:7474/db/data/cypher',
      json   : {query: query, params: params}
    },
    function(err, res, body) {
      callback(err, body);
    });

......我明白了:(只有s.title有数据)

{ columns: [ 's.title', 'sg.title' ],
  data: 
   [ [ 'My forbidden lover', null ],
     [ 'Step back', null ],
     [ 'Shake it off', null ],
     [ 'Two Hearts', null ],
     [ 'Homelands', null ] ] }

我已经尝试了模块neo4j-node和seraph,两者都给了我相同的结果(sg.title = null)

但是,当我使用Postman时,一切都会再次运作。

POST localhost:7474 / db / data / cypher 将body(raw)设置为

{
  "query" : "match (s:Song) optional match (sg:SongGroup)-[r:SONGGROUP_SONG]->(s) where id(sg) = {recId} return s.title, sg.title ",
  "params" : {"recId": 294}

}

知道为什么这在浏览器和邮递员中有效,但在节点中却没有?

1 个答案:

答案 0 :(得分:2)

您需要解析recId以使其为整数,而不是字符串。 (请注意,获得此结论所需的信息不会包含在此页面中,但它位于this one上。

当您将其解析为字符串时,cypher会尝试比较id(sg)"294"的相等性,一个是整数,另一个是字符串。适用于JS,但不适用于Cypher。