Neo4j JSON 对象到元素

Neo4j JSON Objects to Elements

我不确定我使用的术语是否正确,如有必要请随时更正。我(认为)我有 JSON 个对象,我正试图将其转换为元素数组。

我在 Ruby 中使用 Neography 来查询 Neo4j 数据库,当我收到返回的结果时,我需要它们看起来像这样:

["apple","orange","pear"]

然而,它们看起来像这样:

[["apple"],["orange"],["pear"]]

我用来创建这个的 Ruby 是:

cypher = "MATCH (n:Person) WHERE n.name =~ '(?i).*#{term}.*' RETURN n.name"
results = neo.execute_query(cypher)["data"].to_json
puts results
results

我在此处阅读 (How to Remove Square bracket from JSON) 以尝试解析 JSON 并获取第一个元素。

cypher = "MATCH (n:Person) WHERE n.name =~ '(?i).*#{term}.*' RETURN n.name"
results = neo.execute_query(cypher)["data"].to_json  
results = JSON.parse(results)
puts results
results.to_s # deals with Sinatra not being able to display a hash?

但得到了相同的双括号结果。

这个

cypher = "MATCH (n:Person) WHERE n.name =~ '(?i).*#{term}.*' RETURN n.name"
results = neo.execute_query(cypher)["data"].flatten

应该可以

我建议查看 Neo4j.rb 项目(neo4j-coreneo4j gem)。完全披露:我是维护者之一;)。使用 neo4j-core 你可以这样做:

neo4j_session = Neo4j::Session.open(:server_db, 'http://neo4j:password@localhost:7474')
cypher = "MATCH (n:Person) WHERE n.name =~ '(?i).*#{term}.*' RETURN n.name AS name"
results = neo4j_session.query(cypher).map(&:name)

不过,您通常应该使用参数来防止注入攻击:

cypher = "MATCH (n:Person) WHERE n.name =~ {regex} RETURN n.name AS name"
results = neo4j_session.query(cypher, regex: "(?i).*#{term}.*").map(&:name)

您还可以使用 Query API 为您生成参数,并将 Ruby 正则表达式转换为 Cypher 语法:

results = neo4j_session.query.match(n: :Person).where(n: {name: /#{term}/i}).pluck('n.name')

如果你使用 neo4j gem 中的 ActiveNode 就更简单了:

class Person
  include Neo4j::ActiveNode

  property :name, type: String
end

Person.where(name: /#{term}/i).pluck(:name)

您甚至可以在 Person 模型上创建一个搜索方法来为您执行此操作:

class Person
  include Neo4j::ActiveNode

  property :name, type: String

  def search(term)
    all.where(name: /#{term}/i)
  end
end

Person.search(term).pluck(:name)