javascript - 如何解决 Neo4j Cypher 中处理 JSON 时的困境?

标签 javascript json node.js neo4j

我发现在编写 Node.js 应用程序时无法在 Cypher 查询中使用标准 JSON 字符串:

var neo4j = require('neo4j')
   ,db = new neo4j.GraphDatabase('http://localhost:7474')
   ,enc_datum = JSON.stringify({id: 1, data: 'foo'})
   ,qstr  = ['MATCH (n %DATUM)'
            ,'RETURN n'
            ].join('\n')
          .replace('%DATUM', enc_datum)
db.query(qstr)

它会提示 '"' 字符,因为 Cypher 接受这样的编码对象:

MATCH (n {id: 1, data: 'foo'})
RETURN n

不是使用 JSON 编码的内容:

var enc_datum = JSON.stringify({id: 1, data: 'foo'})
console.log(enc_datum)
// would be {"id":1,"data":"foo"}

错误消息显示,由于 " 字符,Cypher 或 Neo4j 模块不接受标准 JSON。它会提示 { 后面的下一个字符应该是 identifier 或其他字符。

所以我陷入了困境:要么我必须在 JSON 字符串嵌入查询字符串之前使用一些令人讨厌的 RegExpr 来处理它,要么我必须发明一种方法来编码对象,只为微小的 " 字符。我只想问在我跳入这两种棘手的方法之前是否有一些更合适的解决方案......

(我现在在测试中通过使用 eval 而不是 JSON 来评估我的编码数据来解决这个问题,而该字符串将直接在 Cypher 查询中使用,因此我无法使用 JSON 对其进行字符串化。但我无法以这种方式处理客户端编码的 JSON)

最佳答案

MATCH (n {id: 1, data: 'foo'})

您似乎使用的格式是 JSON5。您可以使用如下代码避免双引号:

var jju = require('jju')

jju.stringify({id: 1, data: 'foo'}, {quote:"'"}).replace(/"/g,'\\x22')
// result: "{id: 1, data: 'foo'}" (string)

jju.parse("{id: 1, data: 'foo'}")
// result: {id: 1, data: 'foo'} (object)

请注意两件重要的事情:

  1. “quote”参数确保模块始终使用单引号来包裹字符串
  2. replace() 确保所有双引号都将编码为\x22(如果它们碰巧出现在您的输入中(即 data: 'foo"bar')
  3. )

我不知道该数据库还有什么其他限制,也许值得用 base64 或其他东西对其进行编码。

关于javascript - 如何解决 Neo4j Cypher 中处理 JSON 时的困境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20841571/

相关文章:

javascript - knexjs 和 postgres : whereRaw within a join

c# - 虚拟目录的绝对路径引用问题

javascript - 仅将 Json 数组中的一定数量的行输出到 HTML 表

json - 发现很难在 delphi 中处理 JSON

javascript - 在 Express + NodeJS 应用程序的 Controller 中使用 ES6 类或对象文字

mysql - 访问数据库时保持代码模块化

Javascript/React window.onerror 触发了两次

javascript - 为什么在用作选择器的类或 ID 已从 HTML 中删除后仍会调用 jQuery 函数?

javascript - 如何将 Replacer 函数与 JSON Stringify 结合使用?

javascript - 在javascript中将整数转换为数字的小数部分最有效的方法是什么?