当我在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}
}
知道为什么这在浏览器和邮递员中有效,但在节点中却没有?
答案 0 :(得分:2)
您需要解析recId
以使其为整数,而不是字符串。 (请注意,获得此结论所需的信息不会包含在此页面中,但它位于this one上。
当您将其解析为字符串时,cypher会尝试比较id(sg)
和"294"
的相等性,一个是整数,另一个是字符串。适用于JS,但不适用于Cypher。