1

正しい用語を使用しているかどうか確信が持てないので、必要に応じて自由に修正してください。私は (思う) 要素の配列に変換しようとしている 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

ここ ( 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?

しかし、同じ二重括弧の結果が得られました。

4

2 に答える 2

1

Neo4j.rb プロジェクト (neo4j-coreおよびneo4jgems) を調べることをお勧めします。完全な開示: 私はメンテナーの 1 人です ;)。あなた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パラメータを作成し、Ruby 正規表現を Cypher 構文に変換する API を使用することもできます。

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

ActiveNodegemから使用する場合はneo4jさらに簡単です。

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)
于 2016-02-17T03:33:25.790 に答える
0

これ

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

動作するはずです

于 2016-02-16T20:06:45.110 に答える