这是我在 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)