activegraph 10.0.0.pre.alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1989 -0
- data/CONTRIBUTORS +12 -0
- data/Gemfile +24 -0
- data/README.md +107 -0
- data/bin/rake +17 -0
- data/config/locales/en.yml +5 -0
- data/config/neo4j/add_classnames.yml +1 -0
- data/config/neo4j/config.yml +38 -0
- data/lib/neo4j.rb +116 -0
- data/lib/neo4j/active_base.rb +89 -0
- data/lib/neo4j/active_node.rb +108 -0
- data/lib/neo4j/active_node/callbacks.rb +8 -0
- data/lib/neo4j/active_node/dependent.rb +11 -0
- data/lib/neo4j/active_node/dependent/association_methods.rb +49 -0
- data/lib/neo4j/active_node/dependent/query_proxy_methods.rb +51 -0
- data/lib/neo4j/active_node/enum.rb +26 -0
- data/lib/neo4j/active_node/has_n.rb +612 -0
- data/lib/neo4j/active_node/has_n/association.rb +278 -0
- data/lib/neo4j/active_node/has_n/association/rel_factory.rb +61 -0
- data/lib/neo4j/active_node/has_n/association/rel_wrapper.rb +23 -0
- data/lib/neo4j/active_node/has_n/association_cypher_methods.rb +108 -0
- data/lib/neo4j/active_node/id_property.rb +224 -0
- data/lib/neo4j/active_node/id_property/accessor.rb +62 -0
- data/lib/neo4j/active_node/initialize.rb +21 -0
- data/lib/neo4j/active_node/labels.rb +207 -0
- data/lib/neo4j/active_node/labels/index.rb +37 -0
- data/lib/neo4j/active_node/labels/reloading.rb +21 -0
- data/lib/neo4j/active_node/node_list_formatter.rb +13 -0
- data/lib/neo4j/active_node/node_wrapper.rb +54 -0
- data/lib/neo4j/active_node/orm_adapter.rb +82 -0
- data/lib/neo4j/active_node/persistence.rb +187 -0
- data/lib/neo4j/active_node/property.rb +60 -0
- data/lib/neo4j/active_node/query.rb +76 -0
- data/lib/neo4j/active_node/query/query_proxy.rb +374 -0
- data/lib/neo4j/active_node/query/query_proxy_eager_loading.rb +177 -0
- data/lib/neo4j/active_node/query/query_proxy_eager_loading/association_tree.rb +75 -0
- data/lib/neo4j/active_node/query/query_proxy_enumerable.rb +110 -0
- data/lib/neo4j/active_node/query/query_proxy_find_in_batches.rb +19 -0
- data/lib/neo4j/active_node/query/query_proxy_link.rb +139 -0
- data/lib/neo4j/active_node/query/query_proxy_methods.rb +302 -0
- data/lib/neo4j/active_node/query/query_proxy_methods_of_mass_updating.rb +86 -0
- data/lib/neo4j/active_node/query_methods.rb +68 -0
- data/lib/neo4j/active_node/reflection.rb +86 -0
- data/lib/neo4j/active_node/rels.rb +11 -0
- data/lib/neo4j/active_node/scope.rb +166 -0
- data/lib/neo4j/active_node/unpersisted.rb +48 -0
- data/lib/neo4j/active_node/validations.rb +59 -0
- data/lib/neo4j/active_rel.rb +67 -0
- data/lib/neo4j/active_rel/callbacks.rb +15 -0
- data/lib/neo4j/active_rel/initialize.rb +28 -0
- data/lib/neo4j/active_rel/persistence.rb +134 -0
- data/lib/neo4j/active_rel/persistence/query_factory.rb +95 -0
- data/lib/neo4j/active_rel/property.rb +95 -0
- data/lib/neo4j/active_rel/query.rb +101 -0
- data/lib/neo4j/active_rel/rel_wrapper.rb +31 -0
- data/lib/neo4j/active_rel/related_node.rb +87 -0
- data/lib/neo4j/active_rel/types.rb +82 -0
- data/lib/neo4j/active_rel/validations.rb +8 -0
- data/lib/neo4j/ansi.rb +14 -0
- data/lib/neo4j/class_arguments.rb +39 -0
- data/lib/neo4j/config.rb +135 -0
- data/lib/neo4j/core.rb +14 -0
- data/lib/neo4j/core/connection_failed_error.rb +6 -0
- data/lib/neo4j/core/cypher_error.rb +37 -0
- data/lib/neo4j/core/driver.rb +66 -0
- data/lib/neo4j/core/has_uri.rb +63 -0
- data/lib/neo4j/core/instrumentable.rb +36 -0
- data/lib/neo4j/core/label.rb +158 -0
- data/lib/neo4j/core/logging.rb +44 -0
- data/lib/neo4j/core/node.rb +23 -0
- data/lib/neo4j/core/querable.rb +88 -0
- data/lib/neo4j/core/query.rb +487 -0
- data/lib/neo4j/core/query_builder.rb +32 -0
- data/lib/neo4j/core/query_clauses.rb +727 -0
- data/lib/neo4j/core/query_ext.rb +24 -0
- data/lib/neo4j/core/query_find_in_batches.rb +49 -0
- data/lib/neo4j/core/relationship.rb +13 -0
- data/lib/neo4j/core/responses.rb +50 -0
- data/lib/neo4j/core/result.rb +33 -0
- data/lib/neo4j/core/schema.rb +30 -0
- data/lib/neo4j/core/schema_errors.rb +12 -0
- data/lib/neo4j/core/wrappable.rb +30 -0
- data/lib/neo4j/errors.rb +57 -0
- data/lib/neo4j/migration.rb +148 -0
- data/lib/neo4j/migrations.rb +27 -0
- data/lib/neo4j/migrations/base.rb +77 -0
- data/lib/neo4j/migrations/check_pending.rb +20 -0
- data/lib/neo4j/migrations/helpers.rb +105 -0
- data/lib/neo4j/migrations/helpers/id_property.rb +75 -0
- data/lib/neo4j/migrations/helpers/relationships.rb +66 -0
- data/lib/neo4j/migrations/helpers/schema.rb +51 -0
- data/lib/neo4j/migrations/migration_file.rb +24 -0
- data/lib/neo4j/migrations/runner.rb +195 -0
- data/lib/neo4j/migrations/schema.rb +44 -0
- data/lib/neo4j/migrations/schema_migration.rb +14 -0
- data/lib/neo4j/model_schema.rb +139 -0
- data/lib/neo4j/paginated.rb +27 -0
- data/lib/neo4j/railtie.rb +105 -0
- data/lib/neo4j/schema/operation.rb +102 -0
- data/lib/neo4j/shared.rb +60 -0
- data/lib/neo4j/shared/attributes.rb +216 -0
- data/lib/neo4j/shared/callbacks.rb +68 -0
- data/lib/neo4j/shared/cypher.rb +37 -0
- data/lib/neo4j/shared/declared_properties.rb +204 -0
- data/lib/neo4j/shared/declared_property.rb +109 -0
- data/lib/neo4j/shared/declared_property/index.rb +37 -0
- data/lib/neo4j/shared/enum.rb +167 -0
- data/lib/neo4j/shared/filtered_hash.rb +79 -0
- data/lib/neo4j/shared/identity.rb +34 -0
- data/lib/neo4j/shared/initialize.rb +64 -0
- data/lib/neo4j/shared/marshal.rb +23 -0
- data/lib/neo4j/shared/mass_assignment.rb +64 -0
- data/lib/neo4j/shared/permitted_attributes.rb +28 -0
- data/lib/neo4j/shared/persistence.rb +282 -0
- data/lib/neo4j/shared/property.rb +240 -0
- data/lib/neo4j/shared/query_factory.rb +102 -0
- data/lib/neo4j/shared/rel_type_converters.rb +43 -0
- data/lib/neo4j/shared/serialized_properties.rb +30 -0
- data/lib/neo4j/shared/type_converters.rb +433 -0
- data/lib/neo4j/shared/typecasted_attributes.rb +98 -0
- data/lib/neo4j/shared/typecaster.rb +53 -0
- data/lib/neo4j/shared/validations.rb +44 -0
- data/lib/neo4j/tasks/migration.rake +202 -0
- data/lib/neo4j/timestamps.rb +11 -0
- data/lib/neo4j/timestamps/created.rb +9 -0
- data/lib/neo4j/timestamps/updated.rb +9 -0
- data/lib/neo4j/transaction.rb +139 -0
- data/lib/neo4j/type_converters.rb +7 -0
- data/lib/neo4j/undeclared_properties.rb +53 -0
- data/lib/neo4j/version.rb +3 -0
- data/lib/neo4j/wrapper.rb +4 -0
- data/lib/rails/generators/neo4j/migration/migration_generator.rb +14 -0
- data/lib/rails/generators/neo4j/migration/templates/migration.erb +9 -0
- data/lib/rails/generators/neo4j/model/model_generator.rb +88 -0
- data/lib/rails/generators/neo4j/model/templates/migration.erb +9 -0
- data/lib/rails/generators/neo4j/model/templates/model.erb +15 -0
- data/lib/rails/generators/neo4j/upgrade_v8/templates/migration.erb +17 -0
- data/lib/rails/generators/neo4j/upgrade_v8/upgrade_v8_generator.rb +32 -0
- data/lib/rails/generators/neo4j_generator.rb +119 -0
- data/neo4j.gemspec +51 -0
- metadata +421 -0
data/CONTRIBUTORS
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Maintainers:
|
|
2
|
+
Heinrich Klobuczek <klobuczek @ GitHub>
|
|
3
|
+
Amit Suryanvanshi <amitsuryavanshi @ GitHub>
|
|
4
|
+
|
|
5
|
+
Previous Maintainers:
|
|
6
|
+
Chris Grigg <subvertallchris @ GitHub>
|
|
7
|
+
Brian Underwood <cheerfulstoic @ GitHub>
|
|
8
|
+
|
|
9
|
+
Creator:
|
|
10
|
+
Andreas Ronge <andreasronge @ GitHub>
|
|
11
|
+
|
|
12
|
+
See: https://github.com/neo4jrb/neo4j/graphs/contributors
|
data/Gemfile
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
source 'http://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gemspec
|
|
4
|
+
|
|
5
|
+
# gem 'neo4j-ruby-driver', path: '../neo4j-ruby-driver'
|
|
6
|
+
|
|
7
|
+
gem 'listen', '< 3.1'
|
|
8
|
+
|
|
9
|
+
active_model_version = ENV['ACTIVE_MODEL_VERSION']
|
|
10
|
+
gem 'activemodel', "~> #{active_model_version}" if active_model_version
|
|
11
|
+
|
|
12
|
+
group 'test' do
|
|
13
|
+
gem 'coveralls', require: false
|
|
14
|
+
gem 'overcommit'
|
|
15
|
+
gem 'codecov', require: false
|
|
16
|
+
gem 'simplecov', require: false
|
|
17
|
+
gem 'simplecov-html', require: false
|
|
18
|
+
gem 'rspec', '~> 3.4'
|
|
19
|
+
gem 'its'
|
|
20
|
+
gem 'test-unit'
|
|
21
|
+
gem 'colored'
|
|
22
|
+
gem 'dotenv'
|
|
23
|
+
gem 'timecop'
|
|
24
|
+
end
|
data/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Welcome to Neo4j.rb
|
|
2
|
+
|
|
3
|
+
## Code Status
|
|
4
|
+
|
|
5
|
+
[](https://gist.github.com/cheerfulstoic/d107229326a01ff0f333a1d3476e068d)
|
|
6
|
+
[](http://travis-ci.org/neo4jrb/neo4j)
|
|
7
|
+
[](https://coveralls.io/r/neo4jrb/neo4j?branch=master)
|
|
8
|
+
[](https://codeclimate.com/github/neo4jrb/neo4j)
|
|
9
|
+
|
|
10
|
+
## Get Support
|
|
11
|
+
|
|
12
|
+
### Documentation
|
|
13
|
+
|
|
14
|
+
All new documentation will be done via our [readthedocs](http://neo4jrb.readthedocs.org) site, though some old documentation has yet to be moved from our [wiki](https://github.com/neo4jrb/neo4j/wiki) (also there is the [neo4j-core wiki](https://github.com/neo4jrb/neo4j-core/wiki))
|
|
15
|
+
|
|
16
|
+
### Contact Us
|
|
17
|
+
|
|
18
|
+
[](http://stackoverflow.com/questions/ask?tags=neo4j.rb+neo4j+ruby) [](https://gitter.im/neo4jrb/neo4j?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://twitter.com/neo4jrb)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# Introduction
|
|
23
|
+
|
|
24
|
+
Neo4j.rb is an Active Model compliant Ruby/JRuby wrapper for [the Neo4j graph database](http://www.neo4j.org/). It uses the [neo4j-core](https://github.com/neo4jrb/neo4j-core) and [active_attr](https://github.com/cgriego/active_attr) gems.
|
|
25
|
+
|
|
26
|
+
Neo4j is a transactional, open-source graph database. A graph database manages data in a connected data structure, capable of representing any kind of data in a very accessible way. Information is stored in nodes and relationships connecting them, both of which can have arbitrary properties. To learn more visit [What is a Graph Database?](http://neo4j.com/developer/graph-database/)
|
|
27
|
+
|
|
28
|
+
With this gem you not only do you get a convenient higher level wrapper around Neo4j, but you have access to a powerful high-level query building interface which lets you take advantage of the power of Neo4j like this:
|
|
29
|
+
|
|
30
|
+
```ruby
|
|
31
|
+
# Break down the top countries where friends' favorite beers come from
|
|
32
|
+
person.friends.favorite_beers.country_of_origin(:country).
|
|
33
|
+
order('count(country) DESC').
|
|
34
|
+
pluck(:country, count: 'count(country)')
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
It can be installed in your `Gemfile` with a simple `gem 'neo4j'`
|
|
38
|
+
|
|
39
|
+
For a general overview see our website: http://neo4jrb.io/
|
|
40
|
+
|
|
41
|
+
Winner of a 2014 Graphie for "Best Community Contribution" at Neo4j's [Graph Connect](http://graphconnect.com) conference!
|
|
42
|
+

|
|
43
|
+
|
|
44
|
+
Neo4j.rb v4.1.0 was released in January of 2015. Its changes are outlined [here](https://github.com/neo4jrb/neo4j/wiki/Neo4j.rb-v4-Introduction) and in the [announcement message](http://neo4jrb.io/blog/2015/01/09/neo4j-rb_v4-1_released.html). It will take a little time before all documentation is updated to reflect the new release but unless otherwise noted, all 3.X documentation is totally valid for v4.
|
|
45
|
+
|
|
46
|
+
## Neo4j version support
|
|
47
|
+
|
|
48
|
+
| **Neo4j Version** | v2.x | v3.x | >= v4.x | >= 7.0.3 |
|
|
49
|
+
|-------------------|------|-------|---------|----------|
|
|
50
|
+
| 1.9.x | Yes | No | No | No |
|
|
51
|
+
| 2.0.x | No | Yes | No | No |
|
|
52
|
+
| 2.1.x | No | Yes | Yes * | Yes |
|
|
53
|
+
| 2.2.x | No | No | Yes | Yes |
|
|
54
|
+
| 2.3.x | No | No | Yes | Yes |
|
|
55
|
+
| >= 3.0.0 | No | No | No | Yes |
|
|
56
|
+
|
|
57
|
+
`*` Neo4j.rb >= 4.x doesn't support Neo4j versions before 2.1.5. To use 2.1.x you should upgrade to a version >= 2.1.5
|
|
58
|
+
|
|
59
|
+
## Neo4j feature support
|
|
60
|
+
|
|
61
|
+
| **Neo4j Feature** | v2.x | v3.x | >= v4.x | >= 8.x |
|
|
62
|
+
|----------------------------|--------|------|---------|--------|
|
|
63
|
+
| Bolt Protocol | No | No | No | Yes |
|
|
64
|
+
| Auth | No | No | Yes | Yes |
|
|
65
|
+
| Remote Cypher | Yes | Yes | Yes | Yes |
|
|
66
|
+
| Transactions | Yes | Yes | Yes | Yes |
|
|
67
|
+
| High Availability | No | Yes | Yes | Yes |
|
|
68
|
+
| Embedded JVM support | Yes | Yes | Yes | Yes |
|
|
69
|
+
|
|
70
|
+
## Documentation
|
|
71
|
+
|
|
72
|
+
* [Website](http://neo4jrb.io/) (for an introduction)
|
|
73
|
+
* [readthedocs](http://neo4jrb.readthedocs.io/)
|
|
74
|
+
* **Note:** Our GitHub Wiki pages have outdated information. We are in the process of moving all documentation to [readthedocs](http://neo4jrb.readthedocs.io/)
|
|
75
|
+
|
|
76
|
+
## Legacy (<= 2.x) Documentation
|
|
77
|
+
|
|
78
|
+
* [README](https://github.com/neo4jrb/neo4j/tree/2.x)
|
|
79
|
+
* [Wiki](https://github.com/neo4jrb/neo4j/wiki/Neo4j%3A%3ARails-Introduction)
|
|
80
|
+
|
|
81
|
+
## Developers
|
|
82
|
+
|
|
83
|
+
### Original Author
|
|
84
|
+
|
|
85
|
+
* [Andreas Ronge](https://github.com/andreasronge)
|
|
86
|
+
|
|
87
|
+
### Previous Maintainers
|
|
88
|
+
|
|
89
|
+
* [Brian Underwood](https://github.com/cheerfulstoic)
|
|
90
|
+
* [Chris Grigg](https://github.com/subvertallchris)
|
|
91
|
+
|
|
92
|
+
### Current Maintainers
|
|
93
|
+
|
|
94
|
+
* [Heinrich Klobuczek](https://github.com/klobuczek)
|
|
95
|
+
* [Amit Suryavanshi](https://github.com/amitsuryavanshi)
|
|
96
|
+
|
|
97
|
+
## Contributing
|
|
98
|
+
|
|
99
|
+
Always welcome! Please review the [guidelines for contributing](CONTRIBUTING.md) to this repository.
|
|
100
|
+
|
|
101
|
+
## License
|
|
102
|
+
|
|
103
|
+
* Neo4j.rb - MIT, see the [LICENSE](http://github.com/andreasronge/neo4j/tree/master/LICENSE).
|
|
104
|
+
* Neo4j - Dual free software/commercial license, see [Licensing Guide](http://www.neo4j.org/learn/licensing).
|
|
105
|
+
|
|
106
|
+
**Notice:** There are different licenses for the `neo4j-community`, `neo4j-advanced`, and `neo4j-enterprise` jar gems. Only the `neo4j-community` gem is required by default.
|
|
107
|
+
|
data/bin/rake
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
#
|
|
4
|
+
# This file was generated by Bundler.
|
|
5
|
+
#
|
|
6
|
+
# The application 'rake' is installed as part of a gem, and
|
|
7
|
+
# this file is here to facilitate running it.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
require 'pathname'
|
|
11
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
|
12
|
+
Pathname.new(__FILE__).realpath)
|
|
13
|
+
|
|
14
|
+
require 'rubygems'
|
|
15
|
+
require 'bundler/setup'
|
|
16
|
+
|
|
17
|
+
load Gem.bin_path('rake', 'rake')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# This file is used as the source for adding _classname properties to nodes and relationships.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#=== Neo4j.rb configuration settings
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# Examples of not using the Neo4j id (neo_id)
|
|
5
|
+
|
|
6
|
+
# Generated UUID stored as a neo4j property on my_id
|
|
7
|
+
#id_property: my_id
|
|
8
|
+
#id_property_type: :auto
|
|
9
|
+
#id_property_type_value: :uuid
|
|
10
|
+
|
|
11
|
+
# Example, (probably more useful directly on Neo4j::ActiveNode classes instead as a global configuration)
|
|
12
|
+
#id_property: title_id
|
|
13
|
+
#id_property_type: :on
|
|
14
|
+
#id_property_type_value: :some_method
|
|
15
|
+
|
|
16
|
+
# TODO
|
|
17
|
+
# if identity map should be on or not
|
|
18
|
+
# It may impact the performance. Using the identity map will keep all loaded wrapper node/relationship
|
|
19
|
+
# object in memory for each thread and transaction - which may speed up or slow down operations.
|
|
20
|
+
identity_map: false
|
|
21
|
+
|
|
22
|
+
# TODO
|
|
23
|
+
# When using the Neo4j::Model you can let neo4j automatically set timestamps when updating/creating nodes.
|
|
24
|
+
# If set to true neo4j.rb automatically timestamps create and update operations if the model has properties named created_at/created_on or updated_at/updated_on
|
|
25
|
+
# (similar to ActiveRecord).
|
|
26
|
+
timestamps: true
|
|
27
|
+
|
|
28
|
+
# Store a property on objects to cache their ActiveNode/ActiveRel class. It prevents each object load from requiring two database queries.
|
|
29
|
+
# Strings shorter than 44 characters are classified, so this will have almost no impact on disk footprint. See http://docs.neo4j.org/chunked/stable/short-strings.html.
|
|
30
|
+
# Alternatively, call class method Neo4j::ActiveNode:cache_class to set this on specific models.
|
|
31
|
+
# By default, this property is called _classname, set as symbol to override.
|
|
32
|
+
cache_class_names: true
|
|
33
|
+
# class_name_property: :_classname
|
|
34
|
+
|
|
35
|
+
transform_rel_type: :upcase
|
|
36
|
+
|
|
37
|
+
# Enforce has_one relationship. When same reationship is created on reverse object with another object, raise the error.
|
|
38
|
+
enforce_has_one: false
|
data/lib/neo4j.rb
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
require 'neo4j/version'
|
|
3
|
+
|
|
4
|
+
require 'neo4j/core'
|
|
5
|
+
require 'neo4j/core/query_ext' # From this gem
|
|
6
|
+
|
|
7
|
+
require 'neo4j/active_base'
|
|
8
|
+
require 'neo4j/model_schema'
|
|
9
|
+
|
|
10
|
+
require 'active_model'
|
|
11
|
+
require 'active_support/concern'
|
|
12
|
+
require 'active_support/core_ext/class/attribute.rb'
|
|
13
|
+
require 'active_support/core_ext/class/subclasses.rb'
|
|
14
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
|
15
|
+
require 'json'
|
|
16
|
+
|
|
17
|
+
require 'neo4j/errors'
|
|
18
|
+
require 'neo4j/config'
|
|
19
|
+
require 'neo4j/wrapper'
|
|
20
|
+
require 'neo4j/active_rel/rel_wrapper'
|
|
21
|
+
require 'neo4j/active_node/node_wrapper'
|
|
22
|
+
require 'neo4j/shared/type_converters'
|
|
23
|
+
require 'neo4j/shared/rel_type_converters'
|
|
24
|
+
require 'neo4j/shared/marshal'
|
|
25
|
+
require 'neo4j/type_converters'
|
|
26
|
+
require 'neo4j/paginated'
|
|
27
|
+
require 'neo4j/schema/operation'
|
|
28
|
+
|
|
29
|
+
require 'neo4j/timestamps'
|
|
30
|
+
require 'neo4j/undeclared_properties'
|
|
31
|
+
|
|
32
|
+
require 'neo4j/shared/callbacks'
|
|
33
|
+
require 'neo4j/shared/filtered_hash'
|
|
34
|
+
require 'neo4j/shared/declared_property/index'
|
|
35
|
+
require 'neo4j/shared/declared_property'
|
|
36
|
+
require 'neo4j/shared/declared_properties'
|
|
37
|
+
require 'neo4j/shared/enum'
|
|
38
|
+
require 'neo4j/shared/mass_assignment'
|
|
39
|
+
require 'neo4j/shared/attributes'
|
|
40
|
+
require 'neo4j/shared/typecasted_attributes'
|
|
41
|
+
require 'neo4j/shared/property'
|
|
42
|
+
require 'neo4j/shared/persistence'
|
|
43
|
+
require 'neo4j/shared/validations'
|
|
44
|
+
require 'neo4j/shared/identity'
|
|
45
|
+
require 'neo4j/shared/serialized_properties'
|
|
46
|
+
require 'neo4j/shared/typecaster'
|
|
47
|
+
require 'neo4j/shared/initialize'
|
|
48
|
+
require 'neo4j/shared/query_factory'
|
|
49
|
+
require 'neo4j/shared/cypher'
|
|
50
|
+
require 'neo4j/shared/permitted_attributes'
|
|
51
|
+
require 'neo4j/shared'
|
|
52
|
+
|
|
53
|
+
require 'neo4j/active_rel/callbacks'
|
|
54
|
+
require 'neo4j/active_rel/initialize'
|
|
55
|
+
require 'neo4j/active_rel/property'
|
|
56
|
+
require 'neo4j/active_rel/persistence/query_factory'
|
|
57
|
+
require 'neo4j/active_rel/persistence'
|
|
58
|
+
require 'neo4j/active_rel/validations'
|
|
59
|
+
require 'neo4j/active_rel/query'
|
|
60
|
+
require 'neo4j/active_rel/related_node'
|
|
61
|
+
require 'neo4j/active_rel/types'
|
|
62
|
+
require 'neo4j/active_rel'
|
|
63
|
+
|
|
64
|
+
require 'neo4j/active_node/node_list_formatter'
|
|
65
|
+
require 'neo4j/active_node/dependent'
|
|
66
|
+
require 'neo4j/active_node/dependent/query_proxy_methods'
|
|
67
|
+
require 'neo4j/active_node/dependent/association_methods'
|
|
68
|
+
require 'neo4j/active_node/enum'
|
|
69
|
+
require 'neo4j/active_node/query_methods'
|
|
70
|
+
require 'neo4j/active_node/query/query_proxy_methods'
|
|
71
|
+
require 'neo4j/active_node/query/query_proxy_methods_of_mass_updating'
|
|
72
|
+
require 'neo4j/active_node/query/query_proxy_enumerable'
|
|
73
|
+
require 'neo4j/active_node/query/query_proxy_find_in_batches'
|
|
74
|
+
require 'neo4j/active_node/query/query_proxy_eager_loading'
|
|
75
|
+
require 'neo4j/active_node/query/query_proxy_eager_loading/association_tree'
|
|
76
|
+
require 'neo4j/active_node/query/query_proxy_link'
|
|
77
|
+
require 'neo4j/active_node/labels/index'
|
|
78
|
+
require 'neo4j/active_node/labels/reloading'
|
|
79
|
+
require 'neo4j/active_node/labels'
|
|
80
|
+
require 'neo4j/active_node/id_property/accessor'
|
|
81
|
+
require 'neo4j/active_node/id_property'
|
|
82
|
+
require 'neo4j/active_node/callbacks'
|
|
83
|
+
require 'neo4j/active_node/initialize'
|
|
84
|
+
require 'neo4j/active_node/property'
|
|
85
|
+
require 'neo4j/active_node/persistence'
|
|
86
|
+
require 'neo4j/active_node/validations'
|
|
87
|
+
require 'neo4j/active_node/rels'
|
|
88
|
+
require 'neo4j/active_node/reflection'
|
|
89
|
+
require 'neo4j/active_node/unpersisted'
|
|
90
|
+
require 'neo4j/active_node/has_n'
|
|
91
|
+
require 'neo4j/active_node/has_n/association_cypher_methods'
|
|
92
|
+
require 'neo4j/active_node/has_n/association/rel_wrapper'
|
|
93
|
+
require 'neo4j/active_node/has_n/association/rel_factory'
|
|
94
|
+
require 'neo4j/active_node/has_n/association'
|
|
95
|
+
require 'neo4j/active_node/query/query_proxy'
|
|
96
|
+
require 'neo4j/active_node/query'
|
|
97
|
+
require 'neo4j/active_node/scope'
|
|
98
|
+
require 'neo4j/active_node'
|
|
99
|
+
|
|
100
|
+
require 'active_support/concern'
|
|
101
|
+
require 'neo4j/core/cypher_error'
|
|
102
|
+
require 'neo4j/core/schema_errors'
|
|
103
|
+
|
|
104
|
+
module Neo4j
|
|
105
|
+
extend ActiveSupport::Autoload
|
|
106
|
+
autoload :Migrations
|
|
107
|
+
autoload :Migration
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
load 'neo4j/tasks/migration.rake'
|
|
111
|
+
|
|
112
|
+
require 'neo4j/active_node/orm_adapter'
|
|
113
|
+
if defined?(Rails)
|
|
114
|
+
require 'rails/generators'
|
|
115
|
+
require 'rails/generators/neo4j_generator'
|
|
116
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module Neo4j
|
|
2
|
+
# To contain any base login for ActiveNode/ActiveRel which
|
|
3
|
+
# is external to the main classes
|
|
4
|
+
module ActiveBase
|
|
5
|
+
at_exit do
|
|
6
|
+
@driver&.close
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
# private?
|
|
11
|
+
def current_driver
|
|
12
|
+
(@driver ||= establish_session).tap do |session|
|
|
13
|
+
fail 'No session defined!' if session.nil?
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def on_establish_session(&block)
|
|
18
|
+
@establish_session_block = block
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def establish_session
|
|
22
|
+
@establish_session_block.call if @establish_session_block
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def new_driver(url, options = {})
|
|
26
|
+
verbose_query_logs = Neo4j::Config.fetch(:verbose_query_logs, false)
|
|
27
|
+
Neo4j::Core::Driver
|
|
28
|
+
.new(url, options.merge(verbose_query_logs: verbose_query_logs))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def transaction
|
|
32
|
+
current_transaction || Transaction
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def query(*args)
|
|
36
|
+
transaction.query(*args)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Should support setting driver via config options
|
|
40
|
+
def driver=(driver)
|
|
41
|
+
@driver&.close
|
|
42
|
+
@driver = driver
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def run_transaction(run_in_tx = true)
|
|
46
|
+
Transaction.run(current_driver, run_in_tx) do |tx|
|
|
47
|
+
yield tx
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def new_transaction
|
|
52
|
+
validate_model_schema!
|
|
53
|
+
Neo4j::Transaction.new
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def new_query(options = {})
|
|
57
|
+
validate_model_schema!
|
|
58
|
+
Neo4j::Core::Query.new({session: current_driver}.merge(options))
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def magic_query(*args)
|
|
62
|
+
if args.empty? || args.map(&:class) == [Hash]
|
|
63
|
+
ActiveBase.new_query(*args)
|
|
64
|
+
else
|
|
65
|
+
ActiveBase.current_driver.query(*args)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def current_transaction
|
|
70
|
+
validate_model_schema!
|
|
71
|
+
Transaction.root
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def label_object(label_name)
|
|
75
|
+
Neo4j::Core::Label.new(label_name)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def logger
|
|
79
|
+
@logger ||= (Neo4j::Config[:logger] || ActiveSupport::Logger.new(STDOUT))
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
def validate_model_schema!
|
|
85
|
+
Neo4j::ModelSchema.validate_model_schema! unless Neo4j::Migrations.currently_running_migrations
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
module Neo4j
|
|
2
|
+
# Makes Neo4j nodes and relationships behave like ActiveRecord objects.
|
|
3
|
+
# By including this module in your class it will create a mapping for the node to your ruby class
|
|
4
|
+
# by using a Neo4j Label with the same name as the class. When the node is loaded from the database it
|
|
5
|
+
# will check if there is a ruby class for the labels it has.
|
|
6
|
+
# If there Ruby class with the same name as the label then the Neo4j node will be wrapped
|
|
7
|
+
# in a new object of that class.
|
|
8
|
+
#
|
|
9
|
+
# = ClassMethods
|
|
10
|
+
# * {Neo4j::ActiveNode::Labels::ClassMethods} defines methods like: <tt>index</tt> and <tt>find</tt>
|
|
11
|
+
# * {Neo4j::ActiveNode::Persistence::ClassMethods} defines methods like: <tt>create</tt> and <tt>create!</tt>
|
|
12
|
+
# * {Neo4j::ActiveNode::Property::ClassMethods} defines methods like: <tt>property</tt>.
|
|
13
|
+
#
|
|
14
|
+
# @example Create a Ruby wrapper for a Neo4j Node
|
|
15
|
+
# class Company
|
|
16
|
+
# include Neo4j::ActiveNode
|
|
17
|
+
# property :name
|
|
18
|
+
# end
|
|
19
|
+
# company = Company.new
|
|
20
|
+
# company.name = 'My Company AB'
|
|
21
|
+
# Company.save
|
|
22
|
+
#
|
|
23
|
+
module ActiveNode
|
|
24
|
+
extend ActiveSupport::Concern
|
|
25
|
+
|
|
26
|
+
MARSHAL_INSTANCE_VARIABLES = [:@attributes, :@_persisted_obj, :@default_property_value]
|
|
27
|
+
|
|
28
|
+
include Neo4j::Shared
|
|
29
|
+
include Neo4j::Shared::Identity
|
|
30
|
+
include Neo4j::Shared::Marshal
|
|
31
|
+
include Neo4j::ActiveNode::Initialize
|
|
32
|
+
include Neo4j::ActiveNode::IdProperty
|
|
33
|
+
include Neo4j::Shared::SerializedProperties
|
|
34
|
+
include Neo4j::ActiveNode::Property
|
|
35
|
+
include Neo4j::ActiveNode::Reflection
|
|
36
|
+
include Neo4j::ActiveNode::Persistence
|
|
37
|
+
include Neo4j::ActiveNode::Validations
|
|
38
|
+
include Neo4j::ActiveNode::Callbacks
|
|
39
|
+
include Neo4j::ActiveNode::Query
|
|
40
|
+
include Neo4j::ActiveNode::Labels
|
|
41
|
+
include Neo4j::ActiveNode::Rels
|
|
42
|
+
include Neo4j::ActiveNode::Unpersisted
|
|
43
|
+
include Neo4j::ActiveNode::HasN
|
|
44
|
+
include Neo4j::ActiveNode::Scope
|
|
45
|
+
include Neo4j::ActiveNode::Dependent
|
|
46
|
+
include Neo4j::ActiveNode::Enum
|
|
47
|
+
include Neo4j::Shared::PermittedAttributes
|
|
48
|
+
|
|
49
|
+
def initialize(args = nil)
|
|
50
|
+
self.class.ensure_id_property_info! # So that we make sure all objects have an id_property
|
|
51
|
+
|
|
52
|
+
args = sanitize_input_parameters(args)
|
|
53
|
+
super(args)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def neo4j_obj
|
|
57
|
+
_persisted_obj || fail('Tried to access native neo4j object on a non persisted object')
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
LOADED_CLASSES = []
|
|
61
|
+
|
|
62
|
+
def self.loaded_classes
|
|
63
|
+
LOADED_CLASSES
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
module ClassMethods
|
|
67
|
+
def nodeify(object)
|
|
68
|
+
if object.is_a?(::Neo4j::ActiveNode) || object.nil?
|
|
69
|
+
object
|
|
70
|
+
else
|
|
71
|
+
self.find(object)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
included do
|
|
77
|
+
include Neo4j::Timestamps if Neo4j::Config[:record_timestamps]
|
|
78
|
+
LOADED_CLASSES << self
|
|
79
|
+
|
|
80
|
+
def self.inherited?
|
|
81
|
+
!!@inherited
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.inherited(other)
|
|
85
|
+
Neo4j::ActiveNode::Labels.clear_wrapped_models
|
|
86
|
+
|
|
87
|
+
LOADED_CLASSES << other
|
|
88
|
+
other.instance_variable_set('@inherited', true)
|
|
89
|
+
inherit_id_property(other)
|
|
90
|
+
attributes.each_pair do |k, v|
|
|
91
|
+
other.inherit_property k.to_sym, v.clone, declared_properties[k].options
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
Neo4j::ActiveNode::Labels.add_wrapped_class(other)
|
|
95
|
+
super
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.inherit_id_property(other)
|
|
99
|
+
return if other.manual_id_property? || !self.id_property?
|
|
100
|
+
id_prop = self.id_property_info
|
|
101
|
+
conf = id_prop[:type].empty? && id_prop[:name] != :neo_id ? {auto: :uuid} : id_prop[:type]
|
|
102
|
+
other.id_property id_prop[:name], conf, true
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
ActiveSupport.run_load_hooks(:active_node, self)
|
|
107
|
+
end
|
|
108
|
+
end
|