Class: Neo4j::Core::Query
- Inherits:
- 
      Object
      
        - Object
- Neo4j::Core::Query
 
- Includes:
- Enumerable, QueryClauses, QueryFindInBatches
- Defined in:
- lib/neo4j-core/query.rb
Overview
Allows for generation of cypher queries via ruby method calls (inspired by ActiveRecord / arel syntax)
Can be used to express cypher queries in ruby nicely, or to more easily generate queries programatically.
Also, queries can be passed around an application to progressively build a query across different concerns
See also the following link for full cypher language documentation: docs.neo4j.org/chunked/milestone/cypher-query-lang.html
Constant Summary collapse
- METHODS =
          DELETE clause 
- %w(with start match optional_match using where set create create_unique merge on_create_set on_match_set remove unwind delete return order skip limit) 
- CLAUSES =
- METHODS.map { |method| const_get(method.split('_').map(&:capitalize).join + 'Clause') } 
- MEMOIZED_INSTANCE_VARIABLES =
- [:response, :merge_params] 
Instance Method Summary collapse
- #&(other) ⇒ Object
- 
  
    
      #break  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Allows what’s been built of the query so far to be frozen and the rest built anew. 
- #copy ⇒ Object
- 
  
    
      #create(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    CREATE clause. 
- 
  
    
      #create_unique(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    CREATE UNIQUE clause. 
- 
  
    
      #delete(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    DELETE clause. 
- #each ⇒ Object
- 
  
    
      #exec  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    Executes a query without returning the result. 
- 
  
    
      #initialize(options = {})  ⇒ Query 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of Query. 
- 
  
    
      #limit(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    LIMIT clause. 
- 
  
    
      #match(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    MATCH clause. 
- 
  
    
      #merge(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    MERGE clause. 
- 
  
    
      #on_create_set(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    ON CREATE SET clause. 
- 
  
    
      #on_match_set(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    ON MATCH SET clause. 
- 
  
    
      #optional_match(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    OPTIONAL MATCH clause. 
- 
  
    
      #order(*args)  ⇒ Query 
    
    
      (also: #order_by)
    
  
  
  
  
  
  
  
  
  
    ORDER BY clause. 
- 
  
    
      #params(args)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Allows for the specification of values for params specified in query. 
- 
  
    
      #pluck(*columns)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Return the specified columns as an array. 
- 
  
    
      #remove(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    REMOVE clause. 
- 
  
    
      #reorder(*args)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Clears out previous order clauses and allows only for those specified by args. 
- #response ⇒ Object
- 
  
    
      #return(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    RETURN clause. 
- #return_query(columns) ⇒ Object
- 
  
    
      #set(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    SET clause. 
- 
  
    
      #set_props(*args)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Works the same as the #set method, but when given a nested array it will set properties rather than setting entire objects. 
- 
  
    
      #skip(*args)  ⇒ Query 
    
    
      (also: #offset)
    
  
  
  
  
  
  
  
  
  
    SKIP clause. 
- 
  
    
      #start(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    START clause. 
- 
  
    
      #to_a  ⇒ Array 
    
    
  
  
  
  
  
  
  
  
  
    Class is Enumerable. 
- 
  
    
      #to_cypher  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns a CYPHER query string from the object query representation. 
- 
  
    
      #union_cypher(other, options = {})  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    Returns a CYPHER query specifying the union of the callee object’s query and the argument’s query. 
- 
  
    
      #unwind(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    UNWIND clause. 
- 
  
    
      #using(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    USING clause. 
- 
  
    
      #where(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    WHERE clause. 
- 
  
    
      #with(*args)  ⇒ Query 
    
    
  
  
  
  
  
  
  
  
  
    WITH clause. 
Methods included from QueryFindInBatches
Constructor Details
Instance Method Details
#&(other) ⇒ Object
| 274 275 276 277 278 279 280 281 | # File 'lib/neo4j-core/query.rb', line 274 def &(other) fail "Sessions don't match!" if @session != other.session self.class.new(session: @session).tap do |new_query| new_query. = .merge(other.) new_query.clauses = clauses + other.clauses end.params(other._params) end | 
#break ⇒ Object
Allows what’s been built of the query so far to be frozen and the rest built anew. Can be called multiple times in a string of method calls
| 138 139 140 | # File 'lib/neo4j-core/query.rb', line 138 def break build_deeper_query(nil) end | 
#copy ⇒ Object
| 284 285 286 287 288 289 290 | # File 'lib/neo4j-core/query.rb', line 284 def copy dup.tap do |query| MEMOIZED_INSTANCE_VARIABLES.each do |var| query.instance_variable_set("@#{var}", nil) end end end | 
#delete(*args) ⇒ Query
DELETE clause
| 102 | # File 'lib/neo4j-core/query.rb', line 102 METHODS = %w(with start match optional_match using where set create create_unique merge on_create_set on_match_set remove unwind delete return order skip limit) | 
#each ⇒ Object
| 170 171 172 173 174 175 176 177 | # File 'lib/neo4j-core/query.rb', line 170 def each response = self.response if response.is_a?(Neo4j::Server::CypherResponse) response.to_node_enumeration else Neo4j::Embedded::ResultWrapper.new(response, to_cypher) end.each { |object| yield object } end | 
#exec ⇒ Boolean
Executes a query without returning the result
| 188 189 190 191 192 | # File 'lib/neo4j-core/query.rb', line 188 def exec response true end | 
#order(*args) ⇒ Query Also known as: order_by
ORDER BY clause
|  | # File 'lib/neo4j-core/query.rb', line 50
 | 
#params(args) ⇒ Object
Allows for the specification of values for params specified in query
| 149 150 151 152 153 | # File 'lib/neo4j-core/query.rb', line 149 def params(args) @_params = @_params.merge(args) self end | 
#pluck(*columns) ⇒ Object
Return the specified columns as an array. If one column is specified, a one-dimensional array is returned with the values of that column If two columns are specified, a n-dimensional array is returned with the values of those columns
| 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 | # File 'lib/neo4j-core/query.rb', line 203 def pluck(*columns) query = return_query(columns) columns = query.response.columns case columns.size when 0 fail ArgumentError, 'No columns specified for Query#pluck' when 1 column = columns[0] query.map { |row| row[column] } else query.map do |row| columns.map do |column| row[column] end end end end | 
#reorder(*args) ⇒ Object
Clears out previous order clauses and allows only for those specified by args
| 119 120 121 122 123 124 | # File 'lib/neo4j-core/query.rb', line 119 def reorder(*args) query = copy query.remove_clause_class(OrderClause) query.order(*args) end | 
#response ⇒ Object
| 155 156 157 158 159 160 161 162 163 164 165 166 | # File 'lib/neo4j-core/query.rb', line 155 def response return @response if @response cypher = to_cypher @response = ActiveSupport::Notifications.instrument('neo4j.cypher_query', context: @options[:context] || 'CYPHER', cypher: cypher, params: merge_params) do @session._query(cypher, merge_params) end if !response.respond_to?(:error?) || !response.error? response else response.raise_cypher_error end end | 
#return_query(columns) ⇒ Object
| 222 223 224 225 226 227 228 229 230 231 232 233 234 235 | # File 'lib/neo4j-core/query.rb', line 222 def return_query(columns) query = copy query.remove_clause_class(ReturnClause) columns = columns.map do |column_definition| if column_definition.is_a?(Hash) column_definition.map { |k, v| "#{k}.#{v}" } else column_definition end end.flatten.map(&:to_sym) query.return(columns) end | 
#set_props(*args) ⇒ Object
Works the same as the #set method, but when given a nested array it will set properties rather than setting entire objects
| 130 131 132 | # File 'lib/neo4j-core/query.rb', line 130 def set_props(*args) build_deeper_query(SetClause, args, set_props: true) end | 
#to_a ⇒ Array
Class is Enumerable. Each yield is a Hash with the key matching the variable returned and the value being the value for that key from the response
|  | # File 'lib/neo4j-core/query.rb', line 179
 | 
#to_cypher ⇒ String
Returns a CYPHER query string from the object query representation
| 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 | # File 'lib/neo4j-core/query.rb', line 242 def to_cypher cypher_string = partitioned_clauses.map do |clauses| clauses_by_class = clauses.group_by(&:class) cypher_parts = CLAUSES.map do |clause_class| clauses = clauses_by_class[clause_class] clause_class.to_cypher(clauses) if clauses end cypher_string = cypher_parts.compact.join(' ') cypher_string.strip end.join ' ' cypher_string = "CYPHER #{@options[:parser]} #{cypher_string}" if @options[:parser] cypher_string.strip end | 
#union_cypher(other, options = {}) ⇒ String
Returns a CYPHER query specifying the union of the callee object’s query and the argument’s query
| 270 271 272 | # File 'lib/neo4j-core/query.rb', line 270 def union_cypher(other, = {}) "#{to_cypher} UNION#{[:all] ? ' ALL' : ''} #{other.to_cypher}" end |