neography-ajaycb 0.0.21
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|