历史简史
我有一个JavaScript对象,它存储查询模板与$nameParam
,以便它可以用string.replace()
替换。问题是,直到现在我需要$nameParam
是在引号,现在我需要摆脱他们。根据添加它们的时间,查询可能有效,也可能无效。我观察到一些有趣的行为:
替代字符串
的方法这个方法基本上调用数据库并获取记录。您可以看到最长的一行—它负责用提供的参数替换$nameParam
。
function setupEndpoint(app) {
app.get('/neo4jdb/:queryType',
async (req, res) => {
const session = driver.session();
res.on('finish', () => session.close());
try {
const response = await session.run(queryTemplates[req.params.queryType],
{ nameParam: req.query.name });
let statement = response.summary.query.text.replace('$nameParam', `"${response.summary.query.parameters.nameParam}"`);
statement = statement.replace('RETURN', 'nRETURN');
console.info(`Neo4j statement: ${statement}`);
res.send({ rawItems: response.records, statement });
} catch (err) {
console.error('Error connecting Neo4j', configs);
console.error(err);
res.send({ error: 'Error connecting Neo4j' });
}
});
}
<标题>工作示例
查询模板const queryTemplates = {
getShipsForCompany: `MATCH (A:Company) -[RELATIONSHIP]-> (B:Ship) MATCH (B:Ship)-[RD]-()
WHERE A.name=$nameParam RETURN B as Ship, A as Company, type(RELATIONSHIP) as R, count(RD) as degree limit 50`
};
替换
response.summary.query.text.replace('$nameParam', `"${response.summary.query.parameters.nameParam}"`);
产生输出
Neo4j statement: MATCH (A:Company) -[RELATIONSHIP]-> (B:Ship) MATCH (B:Ship)-[RD]-() WHERE A.name="TRINITY HOUSE"
RETURN B as Ship, A as Company, type(RELATIONSHIP) as R, count(RD) as degree limit 50
<标题>不工作例子
查询模板const queryTemplates = {
getShipsForCompany: `MATCH (A:Company) -[RELATIONSHIP]-> (B:Ship) MATCH (B:Ship)-[RD]-()
WHERE A.name="$nameParam" RETURN B as Ship, A as Company, type(RELATIONSHIP) as R, count(RD) as degree limit 50`
};
替换
response.summary.query.text.replace('$nameParam', `${response.summary.query.parameters.nameParam}`);
产生输出
Neo4j statement: MATCH (A:Company) -[RELATIONSHIP]-> (B:Ship) MATCH (B:Ship)-[RD]-() WHERE A.name="TRINITY HOUSE"
RETURN B as Ship, A as Company, type(RELATIONSHIP) as R, count(RD) as degree limit 50
<标题>总结生成的两个输出查询是相同的。为什么第一个返回结果,第二个是空的?(第二个复制到DB引擎工作正常)
标题>标题>标题>Neo4j密码语法如下。
WHERE A.name=$nameParam
参数名不应该有双引号。因此,第二个例子是运行时的语法错误。