如果我移动硬编码引号,查询将不起作用
Query doesn't work if I move hardcoded quotation marks
简史
我有一个 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
总结
两个生成的输出查询是相同的。为什么第一个 returns 结果而第二个是空的? (第二个复制到数据库引擎工作正常)
Neo4j 密码语法如下。
WHERE A.name=$nameParam
参数名称不应有双引号。因此,第二个例子是运行时的语法错误。
简史
我有一个 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
总结
两个生成的输出查询是相同的。为什么第一个 returns 结果而第二个是空的? (第二个复制到数据库引擎工作正常)
Neo4j 密码语法如下。
WHERE A.name=$nameParam
参数名称不应有双引号。因此,第二个例子是运行时的语法错误。