Save or load a graph using a JSON document.

The graph (or the specified part of it) is stored as a JSON object with the following properties:

  • "nodes": An array with all nodes. Each node is an object with the following properties:
    • "labels": An array of all applied labels.
    • "properties": An object mapping each defined property to its value.
  • "edges": An array with all relationships. Each relationship is an object with the following properties:
    • "type": The type (String) of the relationship.
    • "properties": An object mapping each defined property to its value.
    • "from": The local ID of the source node.
    • "to": The local ID of the destination node.
import neo4j::graph::sequential_id

var graph = new NeoGraph(new SequentialNodeCollection("nid"))
var a = new NeoNode
a.labels.add "Foo"
a["answer"] = 42
a["Ultimate question of"] = new JsonArray.from(["life",
        "the Universe", "and Everything."])
graph.nodes.register a
var b = graph.create_node
b.labels.add "Foo"
b.labels.add "Bar"
graph.edges.add new NeoEdge(a, "BAZ", b)

var ostream = new StringWriter
var store = new JsonGraphStore(graph)
store.ostream = ostream
store.save
assert ostream.to_s == """{"nodes":[""" + """
{"labels":["Foo"],"properties":{"answer":42,""" + """
"Ultimate question of":["life","the Universe","and Everything."],""" + """
"nid":1}},""" + """
{"labels":["Foo","Bar"],"properties":{"nid":2}}],""" + """
"edges":[{"type":"BAZ","properties":{},"from":1,"to":2}]}"""

graph.nodes.clear
graph.edges.clear
store.istream = new StringReader(ostream.to_s)
store.load
assert 1 == graph.edges.length
for edge in graph.edges do
    assert "BAZ" == edge.rel_type
    assert a.labels == edge.from.labels
    for k, v in a.properties do assert v == edge.from.properties[k]
    assert b.labels == edge.to.labels
    for k, v in b.properties do assert v == edge.to.properties[k]
end
assert 2 == graph.nodes.length

Introduced properties

init from_io(graph: NeoGraph, iostream: Duplex)

neo4j :: JsonGraphStore :: from_io

Use the specified Duplex.
init from_string(graph: NeoGraph, string: String)

neo4j :: JsonGraphStore :: from_string

Use the specified string to load the graph.
fun istream: nullable Reader

neo4j :: JsonGraphStore :: istream

The stream to use for load.
fun istream=(istream: nullable Reader)

neo4j :: JsonGraphStore :: istream=

The stream to use for load.
fun ostream: nullable Writer

neo4j :: JsonGraphStore :: ostream

The stream to use for save and save_part.
fun ostream=(ostream: nullable Writer)

neo4j :: JsonGraphStore :: ostream=

The stream to use for save and save_part.

Redefined properties

redef type SELF: JsonGraphStore

neo4j $ JsonGraphStore :: SELF

Type of this instance, automatically specialized in every class
redef fun isolated_save: Bool

neo4j $ JsonGraphStore :: isolated_save

Can we save the graph without conflict?
redef fun load

neo4j $ JsonGraphStore :: load

Load the graph (or a part of it).
redef fun save_part(nodes: Collection[NeoNode], edges: Collection[NeoEdge])

neo4j $ JsonGraphStore :: save_part

Save the specified part of the graph.

All properties

fun !=(other: nullable Object): Bool

core :: Object :: !=

Have self and other different values?
fun ==(other: nullable Object): Bool

core :: Object :: ==

Have self and other the same value?
type CLASS: Class[SELF]

core :: Object :: CLASS

The type of the class of self.
type SELF: Object

core :: Object :: SELF

Type of this instance, automatically specialized in every class
protected fun class_factory(name: String): CLASS

core :: Object :: class_factory

Implementation used by get_class to create the specific class.
fun class_name: String

core :: Object :: class_name

The class name of the object.
protected fun fire_done

progression :: Trackable :: fire_done

Notice the registered ProgessionListener that the operation is done.
protected fun fire_progressed(done_part: Int, total: Int)

progression :: Trackable :: fire_progressed

Notice the registered ProgessionListener that the operation progressed.
protected fun fire_started

progression :: Trackable :: fire_started

Notice the registered ProgessionListener that the operation started.
init from_io(graph: NeoGraph, iostream: Duplex)

neo4j :: JsonGraphStore :: from_io

Use the specified Duplex.
init from_string(graph: NeoGraph, string: String)

neo4j :: JsonGraphStore :: from_string

Use the specified string to load the graph.
fun get_class: CLASS

core :: Object :: get_class

The meta-object representing the dynamic type of self.
fun graph: NeoGraph

neo4j :: GraphStore :: graph

The graph to save or load.
protected fun graph=(graph: NeoGraph)

neo4j :: GraphStore :: graph=

The graph to save or load.
fun hash: Int

core :: Object :: hash

The hash code of the object.
init init

core :: Object :: init

fun inspect: String

core :: Object :: inspect

Developer readable representation of self.
protected fun inspect_head: String

core :: Object :: inspect_head

Return "CLASSNAME:#OBJECTID".
intern fun is_same_instance(other: nullable Object): Bool

core :: Object :: is_same_instance

Return true if self and other are the same instance (i.e. same identity).
fun is_same_serialized(other: nullable Object): Bool

core :: Object :: is_same_serialized

Is self the same as other in a serialization context?
intern fun is_same_type(other: Object): Bool

core :: Object :: is_same_type

Return true if self and other have the same dynamic type.
abstract fun isolated_save: Bool

neo4j :: GraphStore :: isolated_save

Can we save the graph without conflict?
fun istream: nullable Reader

neo4j :: JsonGraphStore :: istream

The stream to use for load.
fun istream=(istream: nullable Reader)

neo4j :: JsonGraphStore :: istream=

The stream to use for load.
abstract fun load

neo4j :: GraphStore :: load

Load the graph (or a part of it).
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
fun ostream: nullable Writer

neo4j :: JsonGraphStore :: ostream

The stream to use for save and save_part.
fun ostream=(ostream: nullable Writer)

neo4j :: JsonGraphStore :: ostream=

The stream to use for save and save_part.
fun output

core :: Object :: output

Display self on stdout (debug only).
intern fun output_class_name

core :: Object :: output_class_name

Display class name on stdout (debug only).
protected fun progression_listeners=(progression_listeners: SimpleCollection[ProgressionListener])

progression :: Trackable :: progression_listeners=

Listen to the progression of the operation.
fun save

neo4j :: GraphStore :: save

Save the graph.
abstract fun save_part(nodes: Collection[NeoNode], edges: Collection[NeoEdge])

neo4j :: GraphStore :: save_part

Save the specified part of the graph.
fun serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
package_diagram neo4j::JsonGraphStore JsonGraphStore neo4j::GraphStore GraphStore neo4j::JsonGraphStore->neo4j::GraphStore progression::Trackable Trackable neo4j::GraphStore->progression::Trackable ...progression::Trackable ... ...progression::Trackable->progression::Trackable

Ancestors

interface Object

core :: Object

The root of the class hierarchy.
abstract class Trackable

progression :: Trackable

An operation that is trackable using a ProgressionListener.

Parents

abstract class GraphStore

neo4j :: GraphStore

A mean to save and load a Neo4j graph.

Class definitions

neo4j $ JsonGraphStore
# Save or load a graph using a JSON document.
#
# The graph (or the specified part of it) is stored as a JSON object with the
# following properties:
#
# * `"nodes"`: An array with all nodes. Each node is an object with the
# following properties:
#	* `"labels"`: An array of all applied labels.
#	* `"properties"`: An object mapping each defined property to its value.
# * `"edges"`: An array with all relationships. Each relationship is an object
# with the following properties:
#	* `"type"`: The type (`String`) of the relationship.
#	* `"properties"`: An object mapping each defined property to its value.
#	* `"from"`: The local ID of the source node.
#	* `"to"`: The local ID of the destination node.
#
# ~~~nit
# import neo4j::graph::sequential_id
#
# var graph = new NeoGraph(new SequentialNodeCollection("nid"))
# var a = new NeoNode
# a.labels.add "Foo"
# a["answer"] = 42
# a["Ultimate question of"] = new JsonArray.from(["life",
#		"the Universe", "and Everything."])
# graph.nodes.register a
# var b = graph.create_node
# b.labels.add "Foo"
# b.labels.add "Bar"
# graph.edges.add new NeoEdge(a, "BAZ", b)
#
# var ostream = new StringWriter
# var store = new JsonGraphStore(graph)
# store.ostream = ostream
# store.save
# assert ostream.to_s == """{"nodes":[""" + """
# {"labels":["Foo"],"properties":{"answer":42,""" + """
# "Ultimate question of":["life","the Universe","and Everything."],""" + """
# "nid":1}},""" + """
# {"labels":["Foo","Bar"],"properties":{"nid":2}}],""" + """
# "edges":[{"type":"BAZ","properties":{},"from":1,"to":2}]}"""
#
# graph.nodes.clear
# graph.edges.clear
# store.istream = new StringReader(ostream.to_s)
# store.load
# assert 1 == graph.edges.length
# for edge in graph.edges do
#	assert "BAZ" == edge.rel_type
#	assert a.labels == edge.from.labels
#	for k, v in a.properties do assert v == edge.from.properties[k]
#	assert b.labels == edge.to.labels
#	for k, v in b.properties do assert v == edge.to.properties[k]
# end
# assert 2 == graph.nodes.length
# ~~~
class JsonGraphStore
	super GraphStore

	# The stream to use for `load`.
	var istream: nullable Reader = null is writable

	# The stream to use for `save` and `save_part`.
	var ostream: nullable Writer = null is writable

	# Use the specified `Duplex`.
	init from_io(graph: NeoGraph, iostream: Duplex) do
		init(graph)
		istream = iostream
		ostream = iostream
	end

	# Use the specified string to load the graph.
	init from_string(graph: NeoGraph, string: String) do
		init(graph)
		istream = new StringReader(string)
	end

	redef fun isolated_save do return true

	redef fun load do
		var istream = self.istream
		assert istream isa Reader
		fire_started
		graph.load_json(istream.read_all)
		fire_done
	end

	redef fun save_part(nodes, edges) do
		var ostream = self.ostream
		assert ostream isa Writer
		fire_started
		ostream.write(graph.to_json)
		fire_done
	end
end
lib/neo4j/graph/json_graph_store.nit:16,1--111,3