Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

license and docs

  • Loading branch information...
commit 3802816626e2a8ca4ced3d865c514c60c4a7650b 1 parent 788bc35
@wagjo authored
View
1  .gitignore
@@ -2,3 +2,4 @@ pom.xml
*.jar
lib
classes
+autodoc
View
62 README.md
@@ -1,40 +1,62 @@
-The borneo project provides a more lispy interface to Neo4j, a graph-structured on-disk transactional database.
+# borneo
-This library is under active development and there's plenty more work to do.
+Wrapper for Neo4j, a graph database.
-Wrapper for Neo4j. Because I was not happy with the current state
-(01/2011) of existing Neo4j wrappers for clojure, I've decided to
-create my own.
+Because I was not happy with the current state (01/2011) of existing
+Neo4j wrappers for clojure, I've decided to create my own.
-Purpose of this ns is to provide intiutive access to commonly used
+Purpose of this library is to provide intiutive access to commonly used
Neo4j operations. It uses official Neo4j Java bindings. It does not
use Blueprints interface.
-Disclaimer: I have forked hgavin/clojure-neo4j and modified it
-heavily.
+## Usage
-Disclaimer: Some comments and docs are taken from official Neo4j javadocs.
+Add the following dependency to your project.clj file:
-# Usage:
+ [borneo "0.1.0-SNAPSHOT"]
+
+## Documentation
+
+* API docs are at http://wagjo.github.com/borneo/
* use with-db! to establish a connection to the database
* all db operations must be inside with-db! body
-# Code notes:
+* TODO
+
+## Examples
+
+ (ns foo.example
+ (:require [borneo.core :as neo]))
+
+ (neo/with-neo "/path/to/db"
+
+ TODO
+
+ )
+
+## Contact
+
+* http://github.com/wagjo
+
+* http://www.google.com/profiles/jozef.wagner
-* *neo-db* holds the current db instance, so that users do not have
- to supply db instance at each call to db operations. This
- approach has of course its drawbacks (e.g. only one connection at
- time), but I've found it suitable for my purposes.
+## License
-# Examples:
+Disclaimer: Forked from hgavin/clojure-neo4j
-(ns foo.example
- (:require [borneo.core :as neo]))
+Disclaimer: Small amount of comments and docs are based on official
+Neo4j javadocs.
-(neo/with-neo "/path/to/db"
+Copyright (C) 2011, Jozef Wagner. All rights reserved.
+The use and distribution terms for this software are covered by the
+Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+which can be found in the file epl-v10.html at the root of this
+distribution.
+By using this software in any fashion, you are agreeing to be bound by
+the terms of this license.
-)
+You must not remove this notice, or any other, from this software.
View
9 dev.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cd src/borneo
+
+emacs &
+
+cd ../..
+
+lein swank
View
261 epl-v10.html
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+ body {
+ size: 8.5in 11.0in;
+ margin: 0.25in 0.5in 0.25in 0.5in;
+ tab-interval: 0.5in;
+ }
+ p {
+ margin-left: auto;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ p.list {
+ margin-left: 0.5in;
+ margin-top: 0.05em;
+ margin-bottom: 0.05em;
+ }
+ </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
View
10 project.clj
@@ -1,7 +1,11 @@
(defproject borneo "0.1.0-SNAPSHOT"
- :description "The borneo project provides a more lispy interface to Neo4j, a graph-structured on-disk transactional database."
+ :description "Clojure wrapper for Neo4j, a graph database."
:dependencies [[org.clojure/clojure "1.2.0"]
[org.neo4j/neo4j "1.2"]]
:dev-dependencies [[swank-clojure "1.3.0-SNAPSHOT"]
- [lein-clojars "0.6.0"]]
- :jvm-opts ["-Dswank.encoding=utf-8"])
+ [lein-clojars "0.6.0"]
+ [org.clojars.rayne/autodoc "0.8.0-SNAPSHOT"]]
+ :jvm-opts ["-Dswank.encoding=utf-8"]
+ :autodoc {:copyright "Copyright (C) 2011, Jozef Wagner. All rights reserved."
+ :web-src-dir "http://github.com/wagjo/borneo/blob/"
+ :web-home "http://wagjo.github.com/borneo/"})
View
183 src/borneo/core.clj
@@ -1,8 +1,38 @@
;; Copyright (C) 2011, Jozef Wagner. All rights reserved.
-;; This ns is forked from hgavin/clojure-neo4j
+;;
+;; Disclaimer: Forked from hgavin/clojure-neo4j
+;;
+;; Disclaimer: Small amount of comments and docs are based on official
+;; Neo4j javadocs.
+;;
+;; The use and distribution terms for this software are covered by the
+;; Eclipse Public License 1.0
+;; (http://opensource.org/licenses/eclipse-1.0.php) which can be found
+;; in the file epl-v10.html at the root of this distribution.
+;;
+;; By using this software in any fashion, you are agreeing to be bound
+;; by the terms of this license.
+;;
+;; You must not remove this notice, or any other, from this software.
+;;
+;; Forked from hgavin/clojure-neo4j
(ns borneo.core
- "Neo4j wrapper, forked from hgavin/clojure-neo4j"
+ "Wrapper for Neo4j. Because I was not happy with the current state
+ (01/2011) of existing Neo4j wrappers for clojure, I've decided to
+ create my own.
+
+ Purpose of this library is to provide intiutive access to commonly used
+ Neo4j operations. It uses official Neo4j Java bindings. It does not
+ use Blueprints interface.
+
+ See README for usage instructions, documentation and examples.
+
+ Code notes:
+ - neo-db holds the current db instance, so that users do not have
+ to supply db instance at each call to db operations. This
+ approach has of course its drawbacks (e.g. only one connection at
+ time), but I've found it suitable for my purposes."
(:import (org.neo4j.graphdb Direction
Node
PropertyContainer
@@ -16,48 +46,29 @@
Traverser$Order)
(org.neo4j.kernel EmbeddedGraphDatabase)))
-;; Wrapper for Neo4j. Because I was not happy with the current state
-;; (01/2011) of existing Neo4j wrappers for clojure, I've decided to
-;; create my own.
-;;
-;; Purpose of this ns is to provide intiutive access to commonly used
-;; Neo4j operations. It uses official Neo4j Java bindings. It does not
-;; use Blueprints interface.
-;;
-;; Disclaimer: I have forked hgavin/clojure-neo4j and modified it
-;; heavily.
-;;
-;; Disclaimer: Some comments and docs are taken from official Neo4j javadocs.
-;;
-;;; Usage:
-;; - use with-db! to establish a connection to the database
-;; - all db operations must be inside with-db! body
-;;
-;;; Code notes:
-;; - *neo-db* holds the current db instance, so that users do not have
-;; to supply db instance at each call to db operations. This
-;; approach has of course its drawbacks (e.g. only one connection at
-;; time), but I've found it suitable for my purposes.
;;;; Implementation details
(defonce ^{:private true
:doc "Holds the current database instance"
:tag EmbeddedGraphDatabase}
- *neo-db* nil)
+ neo-db nil)
-(defn- array? [x]
+(defn- array?
"Determine whether x is an array or not"
+ [x]
(-> x class .isArray))
-(defn- name-or-str [x]
+(defn- name-or-str
"If x is keyword, returns its name. If not, stringify the value"
+ [x]
(if (keyword? x)
(name x)
(str x)))
-(defn- process-position [^TraversalPosition p]
+(defn- process-position
"Translate TraversalPosition into a map"
+ [^TraversalPosition p]
{:pos p
:node (.currentNode p)
:depth (.depth p)
@@ -67,57 +78,63 @@
;; :prev-node (.previousNode p)
:count (.returnedNodesCount p)})
-(defn- ^RelationshipType rel-type* [k]
+(defn- ^RelationshipType rel-type*
"Create java class implementing RelationshipType. Used for interop.
TODO: Should we cache these instances to save memory?
Or will they be GCd?"
+ [k]
(proxy [RelationshipType] []
(name [] (name k))))
-(defn- ^Direction rel-dir [k]
+(defn- ^Direction rel-dir
"Translates keyword to the respective relationship direction.
Valid values are :out :in and :both
See javadoc for Direction for more info on directions"
+ [k]
(condp = k
:out Direction/OUTGOING
:in Direction/INCOMING
:both Direction/BOTH
(throw (IllegalArgumentException.))))
-(defn- rel-dir-map [r]
+(defn- rel-dir-map
"Constructs an array or relation types and directions. Accepts
map consisting of relation type keywords as keys and
relation directions keywords (:in or :out) as values.
r canalso be a single keyword; in that case, a default :out will
be added to the array."
+ [r]
(if (keyword? r)
(rel-dir-map {r :out})
(into-array Object
(mapcat (fn [[k v]] [(rel-type* k) (rel-dir v)])
r))))
-(defn- order* [o]
+(defn- order*
"Translates keyword to the respective traverser order.
Valid values are :breadth, :depth and nil (will be :depth)
See javadoc for Traverser for more info in orders."
+ [o]
(cond
(= o :breadth) Traverser$Order/BREADTH_FIRST
(or (= o :depth) (nil? o)) Traverser$Order/DEPTH_FIRST
:else (throw (IllegalArgumentException.))))
-(defn- stop-if [f]
+(defn- stop-if
"Custom StopEvaluator, f should return true when at stop node. f takes one
argument. The function will be passed the current position map to act on."
+ [f]
(proxy [StopEvaluator] []
(isStopNode [^TraversalPosition p] (f (process-position p)))))
-(defn- depth-of [d]
+(defn- depth-of
"Return a StopEvaluator for the given traversal depth."
+ [d]
(if (== d 1)
StopEvaluator/DEPTH_ONE
(stop-if #(== (:depth %) d))))
-(defn- stop-evaluator [e]
+(defn- stop-evaluator
"Translates value to the respective stop evaluator.
Valid values are:
- :end or nil - end of graph
@@ -130,29 +147,32 @@
(stop-evaluator nil)
(stop-evaluator custom-fn)
See javadoc for StopEvaluator for more info."
+ [e]
(cond
(or (= :end e) (nil? e)) StopEvaluator/END_OF_GRAPH
(keyword? e) (depth-of (Integer/parseInt (name e)))
(fn? e) (stop-if e)))
-(defn- return-if [f]
+(defn- return-if
"Custom ReturnableEvaluator, f should return true if node at current
position should be returned. Takes a function of one argument.
The function will be passed the current position map to act on."
+ [f]
(proxy [ReturnableEvaluator] []
(isReturnableNode [^TraversalPosition p] (f (process-position p)))))
-(defn- return-by-props [props]
+(defn- return-by-props
"Creates a ReturnableEvaluator for use with a traverser that returns
nodes that match the specified property values. propmap is a map that
defines key value pairs that ReturnableEvaluator should match on."
+ [props]
(return-if
(fn [pos]
(let [^Node node (:node pos)
check-prop (fn [[k v]] (= v (.getProperty node (name-or-str k) nil)))]
(every? check-prop props)))))
-(defn- return-evaluator [e]
+(defn- return-evaluator
"Translates value to the respective return evaluator.
Valid values are:
- :all-but-start or nil - all but start nodes
@@ -167,31 +187,35 @@
(return-evaluator custom-fn)
(return-evaluator {:uid \"johndoe1\"})
See javadoc for ReturnEvaluator for more info."
+ [e]
(cond
(or (= :all-but-start e) (nil? e)) ReturnableEvaluator/ALL_BUT_START_NODE
(= :all e) ReturnableEvaluator/ALL
(map? e) (return-by-props e)
(fn? e) (return-if e)))
-(defn- start! [path]
+(defn- start!
"Establish a connection to the database.
- Uses *neo-db* to hold the connection."
+ Uses neo-db Var to hold the connection."
+ [path]
(io!)
(let [n (EmbeddedGraphDatabase. path)]
- (alter-var-root #'*neo-db* (fn [_] n))))
+ (alter-var-root #'neo-db (fn [_] n))))
-(defn- stop! []
- "Closes a connection stored in *neo-db*"
+(defn- stop!
+ "Closes a connection stored in neo-db"
+ []
(io!)
- (.shutdown *neo-db*))
+ (.shutdown neo-db))
;;;; Public API
-(defmacro with-db! [path & body]
+(defmacro with-db!
"Establish a connection to the neo db.
Because there is an overhead when establishing connection, users should
not call this macro often. Also note that this macro is not threadsafe."
+ [path & body]
(io!)
`(do
;; Not using binding macro, because db should be accessible
@@ -201,23 +225,26 @@
~@body
(finally (stop!)))))
-(defmacro with-tx [& body]
+(defmacro with-tx
"Establish a transaction. Use it for mutable db operations.
If you do not want to commit it, throw an exception."
- `(let [tx# (.beginTx *neo-db*)]
+ [& body]
+ `(let [tx# (.beginTx neo-db)]
(try
(let [val# (do ~@body)]
(.success tx#)
val#)
(finally (.finish tx#)))))
-(defn id [item]
+(defn id
"Returns id for a given node or relationship"
+ [item]
(.getId item))
-(defn delete! [item]
+(defn delete!
"Deletes node or relationship.
Only node which has no relationships attached to it can be deleted."
+ [item]
(io!)
(with-tx
(.delete item)))
@@ -275,13 +302,13 @@
one of the arguments if you do not care for
either direction of relationship type
Valid directions are :in :out and :both, parameter type can be any keyword.
- Examples: (rel node) ; All rels
- (rel node :foo) ; Rels of :foo type of any direction
- (rel node [:foo :bar :baz]) ; Rels of any of specified types,
+ Examples: (rels node) ; All rels
+ (rels node :foo) ; Rels of :foo type of any direction
+ (rels node [:foo :bar :baz]) ; Rels of any of specified types,
; any directions
- (rel node :foo :in) ; Rels of :foo type, :in direction
- (rel node nil :in) ; Rels of any type of :in direction
- (rel node :foo nil) ; Use (rel node :foo) instead"
+ (rels node :foo :in) ; Rels of :foo type, :in direction
+ (rels node nil :in) ; Rels of any type of :in direction
+ (rels node :foo nil) ; Use (rel node :foo) instead"
([^Node node]
(.getRelationships node))
([^Node node type-or-types]
@@ -303,37 +330,43 @@
([^Node node type direction]
(.getSingleRelationship node (rel-type* type) (rel-dir direction))))
-(defn create-rel! [^Node from type ^Node to]
+(defn create-rel!
"Create relationship of a supplied type between from and to nodes."
+ [^Node from type ^Node to]
(io!)
(with-tx
(.createRelationshipTo from to (rel-type* type))))
-(defn nodes [^Relationship r]
+(defn nodes
"Returns the two nodes attached to the given relationship."
+ [^Relationship r]
(.getNodes r))
-(defn other [^Relationship r ^Node node]
- "Returns other node for given relationship."
+(defn other
+ "Returns other node for given relationship."
+ [^Relationship r ^Node node]
(.getOtherNode r node))
-(defn rel-type [^Relationship r]
- "Returns type of given relationship."
+(defn rel-type
+ "Returns type of given relationship."
+ [^Relationship r]
(keyword (.name (.getType r))))
;;; Properties
-(defn prop? [^PropertyContainer c k]
+(defn prop?
"Returns true if given node or relationship contains
property with a given key"
+ [^PropertyContainer c k]
(.hasProperty c (name-or-str k)))
;; TODO: add fns which are less resource consuming :)
-;; Props fetch all properties and can be very resource consuming if
-;; node contains many properties.
-(defn props [^PropertyContainer c]
- "Return map of properties for a given node or relationship."
+(defn props
+ "Return map of properties for a given node or relationship.
+ Fetches all properties and can be very resource consuming if node
+ contains many large properties"
+ [^PropertyContainer c]
(let [keys (.getPropertyKeys c)
convert-fn (fn [k] [(keyword k)
(let [v (.getProperty c k)]
@@ -360,11 +393,12 @@
value))
(.removeProperty c (name-or-str key))))))
-(defn set-props! [^PropertyContainer c props]
+(defn set-props!
"Sets properties for a given node or relationship.
The property value must be one of the valid property types (see Neo4j docs).
If a property value is nil, removes this property from the given
node or relationship."
+ [^PropertyContainer c props]
(io!)
(with-tx
(doseq [[k v] props]
@@ -372,16 +406,17 @@
;;; Nodes
-(defn root []
+(defn root
"Returns reference/root node."
- (.getReferenceNode *neo-db*))
+ []
+ (.getReferenceNode neo-db))
(defn create-node!
"Creates a new node."
([]
(io!)
(with-tx
- (.createNode *neo-db*)))
+ (.createNode neo-db)))
([props]
(with-tx
(doto (create-node!)
@@ -400,8 +435,9 @@
(create-rel! node type child)
child))))
-(defn delete-node! [node]
+(defn delete-node!
"Delete node and all its relationships."
+ [node]
(io!)
(with-tx
(doseq [r (rels node)]
@@ -425,10 +461,11 @@
;;; Graph traversal
-(defn go [^Node node & types]
+(defn go
"Walk through the graph by following specified relations. Returns last node.
Throws NullPointerException if path is wrong.
Throws NotFoundException if path is ambiguous."
+ [^Node node & types]
(let [next-node (fn [^Node node type]
(second (nodes (single-rel node type))))]
(reduce next-node node types)))
@@ -471,6 +508,8 @@
(comment
+ ;; See README for usage instructions, documentation and examples.
+
(start! "neo-db")
(traverse (root)
Please sign in to comment.
Something went wrong with that request. Please try again.