如果我移动硬编码的引号,查询不起作用



历史简史

我有一个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

参数名不应该有双引号。因此,第二个例子是运行时的语法错误。

最新更新