== Neo4j-core {}[http://travis-ci.org/andreasronge/neo4j-core] This gem only contains the JRuby mapping of the Neo4j graph database. The neo4j.rb gem will be split up into three gems, neo4j-core, {neo4j-wrapper}[http://github.com/andreasronge/neo4j-wrapper] and {neo4j}[http://github.com/andreasronge/neo4j]. This gem will be included by neo4j 2.0.0 gem. This gem contains two modules: Neo4j and Neo4j::Core The Neo4j module is public and the Neo4j::Core(::*) are internal modules. == Documentation * {YARD}[http://rdoc.info/github/andreasronge/neo4j-core/file/README.rdoc] == The public API {Neo4j::Node} The Java Neo4j Node {Neo4j::Relationship} The Java Relationship {Neo4j} The Database {Neo4j::Cypher} Cypher Query Generator, see RSpec spec/neo4j/cypher_spec == Custom Index You can create your own indexer. class MyIndex extend Neo4j::Core::Index::ClassMethods include Neo4j::Core::Index node_indexer do index_names :exact => 'myindex_exact', :fulltext => 'myindex_fulltext' trigger_on :myindex => true, :things => ['a', 'b'] end index :name end All nodes with the property myindex == true or property things 'a' or 'b' will be indexed using this index. Exampel: n = Neo4j::Node.new(:myindex = true, :name => 'foo') MyIndex.find('name: foo').first #=> n == Cypher Example: Neo4j.query { node(3) } Example with parameters: Neo4j.query(Neo4j.ref_node} do |ref| ref <=> :x :x end Notice * The last statement in the expression will be the return value. * You can skip the start, match, where and ret (they are just empty methods). === Cypher Examples "START n0=node(3) RETURN n0" Neo4j.query do start n = node(3) ret n end # the above is same as: Neo4j.query { node(3) } "START n0=node(42) RETURN n0" node(Neo4j::Node.new) "START r0=relationship(3,4) RETURN r0" rel(3,4) "START n0=node(3) MATCH (n0)--(x) RETURN x" start n = node(3) match n <=> :x ret :x "START n0=node(3) MATCH (n0)--(v0) RETURN v0" x = node n = node(3) match n <=> x ret x "START n0=node(3) MATCH (n0)--(v0) RETURN v0.name" x = node n = node(3) match n <=> x ret x[:name] "START n0=node(1) RETURN n0.name AS SomethingTotallyDifferent" x = node(1) x[:name].as('SomethingTotallyDifferent') "START n0=node:fooindex_exact(name:A) RETURN n0" query(FooIndex, "name:A") "START n0=node:fooindex_fulltext(desc="A") RETURN n0" lookup(FooIndex, "desc", "A") "START n0=node(1),n1=node(2) RETURN n0,n1" [node(1), node(2)] "START n0=node(3) MATCH (n0)-->(c)-->(d) RETURN c" node(3) >> node(:c) >> :d :c "START n0=node(3) MATCH (n0)-[r]->(x) RETURN r" node(3) > :r > :x :r "START n0=node(3) MATCH (n0)-[r:friends]->(x) RETURN r" r = rel('r:friends').as(:r) node(3) > r > :x r "START n0=node(3,1) WHERE n0.age < 30 RETURN n0" n=node(3, 1) where n[:age] < 30 ret n "START n0=node(3,4) WHERE n0.desc = "hej" RETURN n0" n=node(3, 4) n[:desc] == "hej" n "START n0=node(3) MATCH (n0)<-[:knows]-(c) RETURN c" a=node(3) a < ':knows' < :c :c "START n0=node(3) MATCH (n0)-[r]->(v1) WHERE type(r) =~ /K.*/ RETURN r" n=node(3) n > (r=rel('r')) > node r.rel_type =~ /K.*/ r "START n0=node(3) MATCH m2 = (n0)-->(b) RETURN b,length(m2)" p = node(3) >> :b; [:b, p.length] "START n0=node(1) MATCH (n0)-->(b) RETURN distinct n0" n=node(1); n>>:b; n.distinct "START n0=node(2) MATCH (n0)-->(x) RETURN n0,count(*)" n = node(2))>>:x [n, count] "START n0=node(2,3,4) RETURN sum(n0.property)" n=node(2, 3, 4) n[:property].sum "START n0=node(2) MATCH (n0)-->(b) RETURN count(distinct n0.eyes)" n=node(2); n>>:b n[:eyes].distinct.count "START n0=node(3,4,5) RETURN ID(n0)" node(3, 4, 5).neo_id "START n0=node(2) WHERE any(x in n0.array WHERE x = "one") RETURN n0" a = node(2) a[:array].any? { |x| x == 'one' } a "START n0=node(3),n1=node(4),n2=node(1) MATCH m4 = (n0)-->(n1)-->(n2) RETURN extract(x in nodes(m4) : x.age)" a=node(3) b=node(4) c=node(1) p=a>>b>>c p.nodes.extract { |x| x[:age] } "START n0=node(3) WHERE abs(n0.x) = 3 RETURN n0" a=node(3); a[:x].abs==3 a "START n0=node(3,4,5,1,2) RETURN n0 ORDER BY n0.name SKIP 1 LIMIT 2" a=node(3,4,5,1,2); ret(a).asc(a[:name]).skip(1).limit(2) # o same as a=node(3,4,5,1,2); ret a, :asc => a[:name], :skip => 1, :limit => 2 For more examples, see the RSpecs == Creates Your Own Wrapper Todo, see {Neo4j::Core::Wrapper} == Changes Changes from the neo4j.rb * Use of YARD instead of RDoc * Some tidy up of the API and code (e.g. Neo4j::Node#rels methods) * Change of Ruby module structure. * More RSpecs and more use of mocking combined with real testing of the Java layer * Make sure that we retrieve relationships and nodes lazy if possible. * Cypher Query DSL