Swift Neo4j 如何在 Cypher Query 中将变量放入引号中



这是我在 Swift Xcode 项目中的代码:

@IBAction func runCypherTapped(_ sender: UIButton) {
        clientName = clientNameField.text
        guard let theo = self.theo else {
            log("Client not initialized yet")
            return
        }
        let result = theo.executeCypherSync("MATCH (c:Client) WHERE c.name = (clientName) RETURN c.name as name, c.dob as dateOfBirth")
        switch result {
        case let .failure(error):
            log("Error while getting cypher results: (error)")
        case let .success(queryResult):
            if let arrayClients = queryResult.rows[21]["name"] as? String {
                log("Asked via Cypher how many nodes there are with label 'name'. Answer: (arrayClients)")
                query.append(arrayClients)
                print(query)
            } else {
                log("Got unexpected answer back")

我想将我的字符串变量clientName放入查询中,但在引号内,Neo4j 需要将您要检索的属性括起来,例如:

MATCH (c:Client) WHERE c.name = "Mr Smith"  RETURN c.name as name

考虑到这一点,我尝试了插值和转义字符,但没有成功。我需要上面的查询来打印出来,但使用"史密斯先生"而不是由我的 clientName 字符串变量定义。

仅供参考,当我打印到控制台时,我得到这个:

WHERE c.name = "Optional("Mr Smith")" RETURN c.name as name

你可以看到它把第一个引号放在史密斯之后,但没有第二个引号。

无需在 Cypher 查询中对引号进行硬编码。您应该只将clientName作为字符串参数传递,这也可以使查询更加高效和安全:

let params: [String:PackProtocol] = ["clientName": clientName]
let result = theo.executeCypherSync(
  "MATCH (c:Client) WHERE c.name = $clientName RETURN c.name as name, c.dob as dateOfBirth",
  params: params)

最新更新