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-core
和 neo4j
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)
我不确定我使用的术语是否正确,如有必要请随时更正。我(认为)我有 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-core
和 neo4j
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)