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

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

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