Neo4j JSON 对象到元素



我不确定我是否使用了正确的术语,所以请在必要时随时更正它。我(认为(我有 JSON 对象,我正在尝试将其转换为元素数组。

我正在使用Ruby中的Negraphy来查询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

我会在这里阅读(如何从 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?

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

我建议研究一下Neo4j.rb项目(neo4j-coreneo4j宝石(。 完全披露:我是;)维护者之一。 使用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宝石中的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)

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

应该工作

相关内容

  • 没有找到相关文章

最新更新