我不确定我是否使用了正确的术语,所以请在必要时随时更正它。我(认为(我有 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-core
和neo4j
宝石(。 完全披露:我是;)维护者之一。 使用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
应该工作