neography-ajaycb 0.0.21
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.
- data/.gitignore +5 -0
- data/.project +12 -0
- data/.travis.yml +1 -0
- data/CONTRIBUTORS +12 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +39 -0
- data/LICENSE +19 -0
- data/README.rdoc +350 -0
- data/Rakefile +15 -0
- data/examples/facebook.rb +40 -0
- data/examples/facebook_v2.rb +25 -0
- data/examples/greatest.rb +43 -0
- data/examples/linkedin.rb +39 -0
- data/examples/linkedin_v2.rb +22 -0
- data/examples/traversal_example1.rb +65 -0
- data/examples/traversal_example2.rb +54 -0
- data/lib/neography.rb +46 -0
- data/lib/neography/config.rb +17 -0
- data/lib/neography/equal.rb +21 -0
- data/lib/neography/index.rb +13 -0
- data/lib/neography/neography.rb +10 -0
- data/lib/neography/node.rb +45 -0
- data/lib/neography/node_path.rb +29 -0
- data/lib/neography/node_relationship.rb +35 -0
- data/lib/neography/node_traverser.rb +142 -0
- data/lib/neography/path_traverser.rb +94 -0
- data/lib/neography/property.rb +53 -0
- data/lib/neography/property_container.rb +17 -0
- data/lib/neography/railtie.rb +8 -0
- data/lib/neography/relationship.rb +68 -0
- data/lib/neography/relationship_traverser.rb +80 -0
- data/lib/neography/rest.rb +534 -0
- data/lib/neography/tasks.rb +131 -0
- data/lib/neography/version.rb +3 -0
- data/neography.gemspec +29 -0
- data/spec/integration/authorization_spec.rb +48 -0
- data/spec/integration/index_spec.rb +32 -0
- data/spec/integration/neography_spec.rb +10 -0
- data/spec/integration/node_path_spec.rb +222 -0
- data/spec/integration/node_relationship_spec.rb +374 -0
- data/spec/integration/node_spec.rb +215 -0
- data/spec/integration/relationship_spec.rb +37 -0
- data/spec/integration/rest_batch_spec.rb +221 -0
- data/spec/integration/rest_bulk_spec.rb +106 -0
- data/spec/integration/rest_experimental_spec.rb +22 -0
- data/spec/integration/rest_gremlin_fail_spec.rb +46 -0
- data/spec/integration/rest_index_spec.rb +297 -0
- data/spec/integration/rest_node_spec.rb +232 -0
- data/spec/integration/rest_path_spec.rb +209 -0
- data/spec/integration/rest_plugin_spec.rb +67 -0
- data/spec/integration/rest_relationship_spec.rb +327 -0
- data/spec/integration/rest_traverse_spec.rb +149 -0
- data/spec/spec_helper.rb +18 -0
- metadata +222 -0
data/.project
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<projectDescription>
|
3
|
+
<name>neography</name>
|
4
|
+
<comment></comment>
|
5
|
+
<projects>
|
6
|
+
</projects>
|
7
|
+
<buildSpec>
|
8
|
+
</buildSpec>
|
9
|
+
<natures>
|
10
|
+
<nature>com.aptana.ruby.core.rubynature</nature>
|
11
|
+
</natures>
|
12
|
+
</projectDescription>
|
data/.travis.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
script: "bundle exec rake neo4j:install neo4j:start spec --trace"
|
data/CONTRIBUTORS
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
neography (0.0.19)
|
5
|
+
httparty (= 0.7.8)
|
6
|
+
json
|
7
|
+
os
|
8
|
+
rubyzip
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: http://rubygems.org/
|
12
|
+
specs:
|
13
|
+
crack (0.1.8)
|
14
|
+
diff-lcs (1.1.3)
|
15
|
+
httparty (0.7.8)
|
16
|
+
crack (= 0.1.8)
|
17
|
+
json (1.6.4)
|
18
|
+
net-http-spy (0.2.1)
|
19
|
+
os (0.9.5)
|
20
|
+
rake (0.8.7)
|
21
|
+
rspec (2.7.0)
|
22
|
+
rspec-core (~> 2.7.0)
|
23
|
+
rspec-expectations (~> 2.7.0)
|
24
|
+
rspec-mocks (~> 2.7.0)
|
25
|
+
rspec-core (2.7.1)
|
26
|
+
rspec-expectations (2.7.0)
|
27
|
+
diff-lcs (~> 1.1.2)
|
28
|
+
rspec-mocks (2.7.0)
|
29
|
+
rubyzip (0.9.5)
|
30
|
+
|
31
|
+
PLATFORMS
|
32
|
+
java
|
33
|
+
ruby
|
34
|
+
|
35
|
+
DEPENDENCIES
|
36
|
+
neography!
|
37
|
+
net-http-spy (= 0.2.1)
|
38
|
+
rake (~> 0.8.7)
|
39
|
+
rspec
|
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2010 Max De Marzi
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,350 @@
|
|
1
|
+
== Welcome to Neography
|
2
|
+
|
3
|
+
Neography is a thin Ruby wrapper to the Neo4j Rest API, for more information:
|
4
|
+
* {Getting Started with Neo4j Server}[http://wiki.neo4j.org/content/Getting_Started_with_Neo4j_Server]
|
5
|
+
* {Neo4j Rest API Reference}[http://components.neo4j.org/neo4j-server/milestone/rest.html]
|
6
|
+
|
7
|
+
If you want to the full power of Neo4j, you will want to use JRuby and the excellent Neo4j.rb gem at https://github.com/andreasronge/neo4j by Andreas Ronge
|
8
|
+
|
9
|
+
A complement to Neography is the Neology Gem at https://github.com/lordkada/neology by Carlo Alberto Degli Atti
|
10
|
+
|
11
|
+
An alternative is the Architect4r Gem at https://github.com/namxam/architect4r by Maximilian Schulz
|
12
|
+
|
13
|
+
=== Neography in the Wild
|
14
|
+
|
15
|
+
* {Vouched}[http://getvouched.com]
|
16
|
+
* {Neovigator}[http://neovigator.herokuapp.com] fork it at https://github.com/maxdemarzi/neovigator
|
17
|
+
* {Neoflix}[http://neoflix.herokuapp.com] fork it at https://github.com/maxdemarzi/neoflix
|
18
|
+
|
19
|
+
=== Getting started with Neography
|
20
|
+
|
21
|
+
* {Getting Started with Ruby and Neo4j}[http://maxdemarzi.com/2012/01/04/getting-started-with-ruby-and-neo4j/]
|
22
|
+
* {Graph visualization with Neo4j}[http://maxdemarzi.com/2012/01/11/graph-visualization-and-neo4j/]
|
23
|
+
* {Neo4j on Heroku}[http://maxdemarzi.com/2012/01/13/neo4j-on-heroku-part-one/]
|
24
|
+
|
25
|
+
|
26
|
+
=== Installation
|
27
|
+
|
28
|
+
gem install 'neography'
|
29
|
+
|
30
|
+
|
31
|
+
After that, in your ruby script:
|
32
|
+
|
33
|
+
require 'rubygems'
|
34
|
+
require 'neography'
|
35
|
+
|
36
|
+
in order to access the functionality.
|
37
|
+
|
38
|
+
|
39
|
+
=== Dependencies
|
40
|
+
|
41
|
+
for use:
|
42
|
+
os
|
43
|
+
rake
|
44
|
+
json
|
45
|
+
httparty
|
46
|
+
|
47
|
+
for development:
|
48
|
+
rspec
|
49
|
+
net-http-spy
|
50
|
+
|
51
|
+
==== Rails
|
52
|
+
|
53
|
+
Just add gem 'neography' to your Gemfile and run bundle install.
|
54
|
+
|
55
|
+
The following tasks will be available to you:
|
56
|
+
|
57
|
+
rake neo4j:install # Install Neo4j to the neo4j directory under your project
|
58
|
+
rake neo4j:install[community,1.6.M03] # Install Neo4j Community edition, version 1.6.M03
|
59
|
+
rake neo4j:install[advanced,1.5] # Install Neo4j Advanced edition, version 1.5
|
60
|
+
rake neo4j:install[enterprise,1.5] # Install Neo4j Enterprise edition, version 1.5
|
61
|
+
rake neo4j:start # Start Neo4j
|
62
|
+
rake neo4j:stop # Stop Neo4j
|
63
|
+
rake neo4j:restart # Restart Neo4j
|
64
|
+
rake neo4j:reset_yes_i_am_sure # Wipe your Neo4j Database
|
65
|
+
|
66
|
+
Windows users will need to run in a command prompt with Administrative Privileges
|
67
|
+
in order to install Neo4j as a Service.
|
68
|
+
|
69
|
+
If you are not using Rails, then add:
|
70
|
+
|
71
|
+
require 'neography/tasks'
|
72
|
+
|
73
|
+
to your Rakefile to have access to these tasks.
|
74
|
+
|
75
|
+
|
76
|
+
=== Documentation
|
77
|
+
|
78
|
+
@neo = Neography::Rest.new({:protocol => 'http://',
|
79
|
+
:server => 'localhost',
|
80
|
+
:port => 7474,
|
81
|
+
:directory => '', # use '/<my directory>' or leave out for default
|
82
|
+
:authentication => 'basic', # 'basic', 'digest' or leave out for default
|
83
|
+
:username => 'your username', #leave out for default
|
84
|
+
:password => 'your password', #leave out for default
|
85
|
+
:log_file => 'neography.log',
|
86
|
+
:log_enabled => false,
|
87
|
+
:max_threads => 20})
|
88
|
+
|
89
|
+
Quick initializer (assumes basic authorization if username is given):
|
90
|
+
|
91
|
+
@neo = Neography::Rest.new("http://username:password@myserver.com:7474/mydirectory")
|
92
|
+
|
93
|
+
|
94
|
+
To Use:
|
95
|
+
|
96
|
+
@neo = Neography::Rest.new # Inialize using all default parameters
|
97
|
+
|
98
|
+
@neo.get_root # Get the root node
|
99
|
+
node1 = @neo.create_node # Create an empty node
|
100
|
+
node2 = @neo.create_node("age" => 31, "name" => "Max") # Create a node with some properties
|
101
|
+
@neo.get_node(node2) # Get a node and its properties
|
102
|
+
@neo.delete_node(node2) # Delete an unrelated node
|
103
|
+
@neo.delete_node!(node2) # Delete a node and all its relationships
|
104
|
+
|
105
|
+
@neo.reset_node_properties(node1, {"age" => 31}) # Reset a node's properties
|
106
|
+
@neo.set_node_properties(node1, {"weight" => 200}) # Set a node's properties
|
107
|
+
@neo.get_node_properties(node1) # Get just the node properties
|
108
|
+
@neo.get_node_properties(node1, ["weight","age"]) # Get some of the node properties
|
109
|
+
@neo.remove_node_properties(node1) # Remove all properties of a node
|
110
|
+
@neo.remove_node_properties(node1, "weight") # Remove one property of a node
|
111
|
+
@neo.remove_node_properties(node1, ["weight","age"]) # Remove multiple properties of a node
|
112
|
+
|
113
|
+
rel1 = @neo.create_relationship("friends", node1, node2) # Create a relationship between node1 and node2
|
114
|
+
rel2 = @neo.get_relationship(rel1) # Get a relationship
|
115
|
+
@neo.get_node_relationships(node1) # Get all relationships
|
116
|
+
@neo.get_node_relationships(node1, "in") # Get only incoming relationships
|
117
|
+
@neo.get_node_relationships(node1, "all", "enemies") # Get all relationships of type enemies
|
118
|
+
@neo.get_node_relationships(node1, "in", "enemies") # Get only incoming relationships of type enemies
|
119
|
+
@neo.delete_relationship(rel1) # Delete a relationship
|
120
|
+
|
121
|
+
@neo.reset_relationship_properties(rel1, {"age" => 31}) # Reset a relationship's properties
|
122
|
+
@neo.set_relationship_properties(rel1, {"weight" => 200}) # Set a relationship's properties
|
123
|
+
@neo.get_relationship_properties(rel1) # Get just the relationship properties
|
124
|
+
@neo.get_relationship_properties(rel1, ["since","met"]) # Get some of the relationship properties
|
125
|
+
@neo.remove_relationship_properties(rel1) # Remove all properties of a relationship
|
126
|
+
@neo.remove_relationship_properties(rel1, "since") # Remove one property of a relationship
|
127
|
+
@neo.remove_relationship_properties(rel1, ["since","met"]) # Remove multiple properties of a relationship
|
128
|
+
|
129
|
+
@neo.list_node_indexes # gives names and query templates for all defined indices
|
130
|
+
@neo.create_node_index(name, type, provider) # creates an index, defaults are "exact" and "lucene"
|
131
|
+
@neo.add_node_to_index(index, key, value, node1) # adds a node to the index with the given key/value pair
|
132
|
+
@neo.remove_node_from_index(index, key, value, node1) # removes a node from the index with the given key/value pair
|
133
|
+
@neo.remove_node_from_index(index, key, node1) # removes a node from the index with the given key
|
134
|
+
@neo.remove_node_from_index(index, node1) # removes a node from the index
|
135
|
+
@neo.get_node_index(index, key, value) # exact query of the node index with the given key/value pair
|
136
|
+
@neo.find_node_index(index, key, value) # advanced query of the node index with the given key/value pair
|
137
|
+
@neo.find_node_index(index, query ) # advanced query of the node index with the given query
|
138
|
+
@neo.list_relationship_indexes # gives names and query templates for relationship indices
|
139
|
+
@neo.create_relationship_index(name, "fulltext", provider) # creates a relationship index with "fulltext" option
|
140
|
+
@neo.add_relationship_to_index(index, key, value, rel1) # adds a relationship to the index with the given key/value pair
|
141
|
+
@neo.remove_relationship_from_index(index, key, value, rel1) # removes a relationship from the index with the given key/value pair
|
142
|
+
@neo.remove_relationship_from_index(index, key, rel1) # removes a relationship from the index with the given key
|
143
|
+
@neo.remove_relationship_from_index(index, rel1) # removes a relationship from the index
|
144
|
+
@neo.get_relationship_index(index, key, value) # exact query of the relationship index with the given key/value pair
|
145
|
+
@neo.find_relationship_index(index, key, value) # advanced query of the relationship index with the given key/value pair
|
146
|
+
@neo.find_relationship_index(index, query) # advanced query of the relationship index with the given query
|
147
|
+
@neo.execute_script("g.v(0)") # sends a Groovy script (through the Gremlin plugin)
|
148
|
+
@neo.execute_script("g.v(id)", {:id => 3}) # sends a parameterized Groovy script (optimized for repeated calls)
|
149
|
+
@neo.execute_query("start n=node(0) return n") # sends a Cypher query (through the Cypher plugin)
|
150
|
+
@neo.execute_query("start n=node(id) return n", {:id => 3}) # sends a parameterized Cypher query (optimized for repeated calls)
|
151
|
+
|
152
|
+
@neo.get_path(node1, node2, relationships, depth=4, algorithm="shortestPath") # finds the shortest path between two nodes
|
153
|
+
@neo.get_paths(node1, node2, relationships, depth=3, algorithm="allPaths") # finds all paths between two nodes
|
154
|
+
|
155
|
+
nodes = @neo.traverse(node1, # the node where the traversal starts
|
156
|
+
"nodes", # return_type "nodes", "relationships" or "paths"
|
157
|
+
{"order" => "breadth first", # "breadth first" or "depth first" traversal order
|
158
|
+
"uniqueness" => "node global", # See Uniqueness in API documentation for options.
|
159
|
+
"relationships" => [{"type"=> "roommates", # A hash containg a description of the traversal
|
160
|
+
"direction" => "all"}, # two relationships.
|
161
|
+
{"type"=> "friends", #
|
162
|
+
"direction" => "out"}], #
|
163
|
+
"prune evaluator" => {"language" => "javascript", # A prune evaluator (when to stop traversing)
|
164
|
+
"body" => "position.endNode().getProperty('age') < 21;"},
|
165
|
+
"return filter" => {"language" => "builtin", # "all" or "all but start node"
|
166
|
+
"name" => "all"},
|
167
|
+
"depth" => 4})
|
168
|
+
|
169
|
+
# "depth" is a short-hand way of specifying a prune evaluator which prunes after a certain depth.
|
170
|
+
# If not specified a depth of 1 is used and if a "prune evaluator" is specified instead of a depth, no depth limit is set.
|
171
|
+
|
172
|
+
Please see the specs for more examples.
|
173
|
+
|
174
|
+
Batch (in progress):
|
175
|
+
|
176
|
+
@neo.batch [:get_node, node1], [:get_node, node2] # Gets two nodes in a batch
|
177
|
+
@neo.batch [:create_node, {"name" => "Max"}],
|
178
|
+
[:create_node, {"name" => "Marc"}] # Creates two nodes in a batch
|
179
|
+
@neo.batch [:set_node_property, node1, {"name" => "Tom"}],
|
180
|
+
[:set_node_property, node2, {"name" => "Jerry"}] # Sets the property of two nodes
|
181
|
+
@neo.batch [:get_relationship, rel1],
|
182
|
+
[:get_relationship, rel2] # Gets two relationships in a batch
|
183
|
+
@neo.batch [:create_relationship, "friends",
|
184
|
+
node1, node2, {:since => "high school"}],
|
185
|
+
[:create_relationship, "friends",
|
186
|
+
node1, node3, {:since => "college"}] # Creates two relationships in a batch
|
187
|
+
@neo.batch [:create_node, {"name" => "Max"}],
|
188
|
+
[:create_node, {"name" => "Marc"}], # Creates two nodes and index them
|
189
|
+
[:add_node_to_index, "test_node_index", key, value, "{0}"],
|
190
|
+
[:add_node_to_index, "test_node_index", key, value, "{1}"],
|
191
|
+
[:create_relationship, "friends", # and create a relationship for those
|
192
|
+
"{0}", "{1}", {:since => "college"}], # newly created nodes
|
193
|
+
[:add_relationship_to_index,
|
194
|
+
"test_relationship_index", key, value, "{4}"] # and index the new relationship
|
195
|
+
|
196
|
+
@neo.batch *[[:create_node, {"name" => "Max"}],
|
197
|
+
[:create_node, {"name" => "Marc"}]] # Use the Splat (*) with Arrays of Arrays
|
198
|
+
|
199
|
+
See http://docs.neo4j.org/chunked/milestone/rest-api-batch-ops.html for Neo4j Batch operations documentation.
|
200
|
+
|
201
|
+
Experimental:
|
202
|
+
|
203
|
+
nodes = @neo.create_nodes(5) # Create 5 empty nodes
|
204
|
+
nodes = @neo.create_nodes_threaded(5) # Create 5 empty nodes using threads
|
205
|
+
nodes = @neo.create_node_nodes([{"age" => 31, "name" => "Max"},
|
206
|
+
{"age" => 24, "name" => "Alex"}) # Create two nodes with properties
|
207
|
+
nodes = @neo.create_node_nodes_threaded([{"age" => 31, "name" => "Max"},
|
208
|
+
{"age" => 24, "name" => "Alex"}) # Create two nodes with properties threaded
|
209
|
+
nodes = @neo.get_nodes([17,86,397,33]) # Get four nodes by their id
|
210
|
+
|
211
|
+
one_set_nodes = @neo.create_nodes(3)
|
212
|
+
another_node = @neo.create_node("age" => 31, "name" => "Max")
|
213
|
+
nodes = @neo.get_nodes([one_set_nodes, another_node]) # Get four nodes
|
214
|
+
|
215
|
+
=== Phase 2
|
216
|
+
|
217
|
+
Trying to mimic the Neo4j.rb API.
|
218
|
+
|
219
|
+
Now we are returning full objects. The properties of the node or relationship can be accessed directly (node.name).
|
220
|
+
The Neo4j ID is available by using node.neo_id .
|
221
|
+
|
222
|
+
@neo2 = Neography::Rest.new ({:server => '192.168.10.1'})
|
223
|
+
|
224
|
+
Neography::Node.create # Create an empty node
|
225
|
+
Neography::Node.create("age" => 31, "name" => "Max") # Create a node with some properties
|
226
|
+
Neography::Node.create(@neo2, {"age" => 31, "name" => "Max"}) # Create a node on the server defined in @neo2
|
227
|
+
Neography::Node.create({"age" => 31, "name" => "Max"}, @neo2) # Same as above, but different order
|
228
|
+
|
229
|
+
Neography::Node.load(5) # Get a node and its properties by id
|
230
|
+
Neography::Node.load(existing_node) # Get a node and its properties by Node
|
231
|
+
Neography::Node.load("http://localhost:7474/db/data/node/2") # Get a node and its properties by String
|
232
|
+
|
233
|
+
Neography::Node.load(@neo2, 5) # Get a node on the server defined in @neo2
|
234
|
+
Neography::Node.load(5, @neo2) # Same as above, but different order
|
235
|
+
|
236
|
+
n1 = Node.create
|
237
|
+
n1.del # Deletes the node
|
238
|
+
n1.exist? # returns true/false if node exists in Neo4j
|
239
|
+
|
240
|
+
n1 = Node.create("age" => 31, "name" => "Max")
|
241
|
+
n1[:age] #returns 31 # Get a node property using [:key]
|
242
|
+
n1.name #returns "Max" # Get a node property as a method
|
243
|
+
n1[:age] = 24 # Set a node property using [:key] =
|
244
|
+
n1.name = "Alex" # Set a node property as a method
|
245
|
+
n1[:hair] = "black" # Add a node property using [:key] =
|
246
|
+
n1.weight = 190 # Add a node property as a method
|
247
|
+
n1[:name] = nil # Delete a node property using [:key] = nil
|
248
|
+
n1.name = nil # Delete a node property by setting it to nil
|
249
|
+
|
250
|
+
n2 = Neography::Node.create
|
251
|
+
new_rel = Neography::Relationship.create(:family, n1, n2) # Create a relationship from my_node to node2
|
252
|
+
new_rel.start_node # Get the start/from node of a relationship
|
253
|
+
new_rel.end_node # Get the end/to node of a relationship
|
254
|
+
new_rel.other_node(n2) # Get the other node of a relationship
|
255
|
+
|
256
|
+
existing_rel = Neography::Relationship.load(12) # Get an existing relationship by id
|
257
|
+
existing_rel.del # Delete a relationship
|
258
|
+
|
259
|
+
Neography::Relationship.create(:friends, n1, n2)
|
260
|
+
n1.outgoing(:friends) << n2 # Create outgoing relationship
|
261
|
+
n1.incoming(:friends) << n2 # Create incoming relationship
|
262
|
+
n1.both(:friends) << n2 # Create both relationships
|
263
|
+
|
264
|
+
n1.outgoing # Get nodes related by outgoing relationships
|
265
|
+
n1.incoming # Get nodes related by incoming relationships
|
266
|
+
n1.both # Get nodes related by any relationships
|
267
|
+
|
268
|
+
n1.outgoing(:friends) # Get nodes related by outgoing friends relationship
|
269
|
+
n1.incoming(:friends) # Get nodes related by incoming friends relationship
|
270
|
+
n1.both(:friends) # Get nodes related by friends relationship
|
271
|
+
|
272
|
+
n1.outgoing(:friends).incoming(:enemies) # Get nodes related by one of multiple relationships
|
273
|
+
n1.outgoing(:friends).depth(2) # Get nodes related by friends and friends of friends
|
274
|
+
n1.outgoing(:friends).depth(:all) # Get nodes related by friends until the end of the graph
|
275
|
+
n1.outgoing(:friends).depth(2).include_start_node # Get n1 and nodes related by friends and friends of friends
|
276
|
+
|
277
|
+
n1.outgoing(:friends).prune("position.endNode().getProperty('name') == 'Tom';")
|
278
|
+
n1.outgoing(:friends).filter("position.length() == 2;")
|
279
|
+
|
280
|
+
n1.rel?(:friends) # Has a friends relationship
|
281
|
+
n1.rel?(:outgoing, :friends) # Has outgoing friends relationship
|
282
|
+
n1.rel?(:friends, :outgoing) # same, just the other way
|
283
|
+
n1.rel?(:outgoing) # Has any outgoing relationships
|
284
|
+
n1.rel?(:both) # Has any relationships
|
285
|
+
n1.rel?(:all) # same as above
|
286
|
+
n1.rel? # same as above
|
287
|
+
|
288
|
+
n1.rels # Get node relationships
|
289
|
+
n1.rels(:friends) # Get friends relationships
|
290
|
+
n1.rels(:friends).outgoing # Get outgoing friends relationships
|
291
|
+
n1.rels(:friends).incoming # Get incoming friends relationships
|
292
|
+
n1.rels(:friends,:work) # Get friends and work relationships
|
293
|
+
n1.rels(:friends,:work).outgoing # Get outgoing friends and work relationships
|
294
|
+
|
295
|
+
n1.all_paths_to(n2).incoming(:friends).depth(4) # Gets all paths of a specified type
|
296
|
+
n1.all_simple_paths_to(n2).incoming(:friends).depth(4) # for the relationships defined
|
297
|
+
n1.all_shortest_paths_to(n2).incoming(:friends).depth(4) # at a maximum depth
|
298
|
+
n1.path_to(n2).incoming(:friends).depth(4) # Same as above, but just one path.
|
299
|
+
n1.simple_path_to(n2).incoming(:friends).depth(4)
|
300
|
+
n1.shortest_path_to(n2).incoming(:friends).depth(4)
|
301
|
+
|
302
|
+
n1.shortest_path_to(n2).incoming(:friends).depth(4).rels # Gets just relationships in path
|
303
|
+
n1.shortest_path_to(n2).incoming(:friends).depth(4).nodes # Gets just nodes in path
|
304
|
+
|
305
|
+
|
306
|
+
See Neo4j API for:
|
307
|
+
* {Order}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/graphdb/Traverser.Order.html]
|
308
|
+
* {Uniqueness}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/kernel/Uniqueness.html]
|
309
|
+
* {Prune Evaluator}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/graphdb/StopEvaluator.html]
|
310
|
+
* {Return Filter}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/graphdb/ReturnableEvaluator.html]
|
311
|
+
|
312
|
+
=== Examples
|
313
|
+
|
314
|
+
A couple of examples borrowed from Matthew Deiters's Neo4jr-social:
|
315
|
+
|
316
|
+
* {Facebook}[https://github.com/maxdemarzi/neography/blob/master/examples/facebook.rb]
|
317
|
+
* {Linked In}[https://github.com/maxdemarzi/neography/blob/master/examples/linkedin.rb]
|
318
|
+
|
319
|
+
Phase 2 way of doing these:
|
320
|
+
|
321
|
+
* {Facebook}[https://github.com/maxdemarzi/neography/blob/master/examples/facebook_v2.rb]
|
322
|
+
* {Linked In}[https://github.com/maxdemarzi/neography/blob/master/examples/linkedin_v2.rb]
|
323
|
+
|
324
|
+
|
325
|
+
=== To Do
|
326
|
+
|
327
|
+
* Batch functions
|
328
|
+
* Phase 2 Index functionality
|
329
|
+
* More Tests
|
330
|
+
* More Examples
|
331
|
+
* Mixins ?
|
332
|
+
|
333
|
+
=== Contributing
|
334
|
+
|
335
|
+
{<img src="https://secure.travis-ci.org/maxdemarzi/neography.png" />}[http://travis-ci.org/maxdemarzi/neography]
|
336
|
+
|
337
|
+
Please create a {new issue}[https://github.com/maxdemarzi/neography/issues] if you run into any bugs.
|
338
|
+
Contribute patches via pull requests.
|
339
|
+
|
340
|
+
=== Help
|
341
|
+
|
342
|
+
If you are just starting out, or need help send me an e-mail at maxdemazi@gmail.com.
|
343
|
+
|
344
|
+
=== Licenses
|
345
|
+
|
346
|
+
* Neography - MIT, see the LICENSE file http://github.com/maxdemarzi/neography/tree/master/LICENSE.
|
347
|
+
* Lucene - Apache, see http://lucene.apache.org/java/docs/features.html
|
348
|
+
* Neo4j - Dual free software/commercial license, see http://neo4j.org
|
349
|
+
|
350
|
+
|