1
0
Fork 0

Added the knows graph of the traversal module to graph examples. Started rewriting traversal examples for new graph module.

This commit is contained in:
Michael Hackstein 2014-06-18 14:44:40 +02:00
parent 479268d450
commit 1d503a0d2a
3 changed files with 141 additions and 285 deletions

View File

@ -33,6 +33,7 @@ var actions = require("org/arangodb/actions");
var db = require("internal").db; var db = require("internal").db;
var traversal = require("org/arangodb/graph/traversal"); var traversal = require("org/arangodb/graph/traversal");
var Traverser = traversal.Traverser; var Traverser = traversal.Traverser;
var graph = require("org/arangodb/general-graph");
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- private functions // --SECTION-- private functions
@ -79,7 +80,9 @@ function notFound (req, res, code, message) {
/// ///
/// - `startVertex`: id of the startVertex, e.g. `"users/foo"`. /// - `startVertex`: id of the startVertex, e.g. `"users/foo"`.
/// ///
/// - `edgeCollection`: name of the collection that contains the edges. /// - `edgeCollection`: **Deprecated** name of the collection that contains the edges.
///
/// - `graphName`: name of the graph that contains the edges.
/// ///
/// - `filter` (optional, default is to include all nodes): /// - `filter` (optional, default is to include all nodes):
/// body (JavaScript code) of custom filter function /// body (JavaScript code) of custom filter function
@ -213,90 +216,49 @@ function notFound (req, res, code, message) {
/// Follow only outbound edges: /// Follow only outbound edges:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalOutbound} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalOutbound}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = '{ "startVertex": "' + a + '", '; /// var body = '{ "startVertex": "' + a + '", ';
/// body += '"edgeCollection" : "' + knows.name() + '", '; /// body += '"graphName" : "' + g.__name + '", ';
/// body += '"direction" : "outbound"}'; /// body += '"direction" : "outbound"}';
/// ///
/// var response = logCurlRequest('POST', url, body); /// var response = logCurlRequest('POST', url, body);
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Follow only inbound edges: /// Follow only inbound edges:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalInbound} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalInbound}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = '{ "startVertex": "' + a + '", '; /// var body = '{ "startVertex": "' + a + '", ';
/// body += '"edgeCollection" : "' + knows.name() + '", '; /// body += '"graphName" : "' + g.__name + '", ';
/// body += '"direction" : "inbound"}'; /// body += '"direction" : "inbound"}';
/// ///
/// var response = logCurlRequest('POST', url, body); /// var response = logCurlRequest('POST', url, body);
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Follow any direction of edges: /// Follow any direction of edges:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalAny} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalAny}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = { /// var body = {
/// startVertex: a, /// startVertex: a,
/// edgeCollection: knows.name(), /// graphName: g.__name,
/// direction: "any", /// direction: "any",
/// uniqueness: { /// uniqueness: {
/// vertices: "none", /// vertices: "none",
@ -308,32 +270,18 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Excluding `Charlie` and `Bob`: /// Excluding `Charlie` and `Bob`:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalFilterExclude} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalFilterExclude}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = '{ "startVertex": "' + a + '", '; /// var body = '{ "startVertex": "' + a + '", ';
/// body += '"edgeCollection" : "' + knows.name() + '", '; /// body += '"graphName" : "' + g.__name + '", ';
/// body += '"direction" : "outbound", '; /// body += '"direction" : "outbound", ';
/// body += '"filter" : "if (vertex.name === \\"Bob\\" || '; /// body += '"filter" : "if (vertex.name === \\"Bob\\" || ';
/// body += 'vertex.name === \\"Charlie\\") {'; /// body += 'vertex.name === \\"Charlie\\") {';
@ -345,32 +293,18 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Do not follow edges from `Bob`: /// Do not follow edges from `Bob`:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalFilterPrune} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalFilterPrune}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = '{ "startVertex": "' + a + '", '; /// var body = '{ "startVertex": "' + a + '", ';
/// body += '"edgeCollection" : "' + knows.name() + '", '; /// body += '"graphName" : "' + g.__name + '", ';
/// body += '"direction" : "outbound", '; /// body += '"direction" : "outbound", ';
/// body += '"filter" : "if (vertex.name === \\"Bob\\") {'; /// body += '"filter" : "if (vertex.name === \\"Bob\\") {';
/// body += 'return \\"prune\\";' /// body += 'return \\"prune\\";'
@ -381,32 +315,18 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Visit only nodes in a depth of at least 2: /// Visit only nodes in a depth of at least 2:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalMinDepth} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalMinDepth}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = '{ "startVertex": "' + a + '", '; /// var body = '{ "startVertex": "' + a + '", ';
/// body += '"edgeCollection" : "' + knows.name() + '", '; /// body += '"graphName" : "' + g.__name + '", ';
/// body += '"direction" : "outbound", '; /// body += '"direction" : "outbound", ';
/// body += '"minDepth" : 2}'; /// body += '"minDepth" : 2}';
/// ///
@ -414,32 +334,18 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Visit only nodes in a depth of at most 1: /// Visit only nodes in a depth of at most 1:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalMaxDepth} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalMaxDepth}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = '{ "startVertex": "' + a + '", '; /// var body = '{ "startVertex": "' + a + '", ';
/// body += '"edgeCollection" : "' + knows.name() + '", '; /// body += '"graphName" : "' + g.__name + '", ';
/// body += '"direction" : "outbound", '; /// body += '"direction" : "outbound", ';
/// body += '"maxDepth" : 1}'; /// body += '"maxDepth" : 1}';
/// ///
@ -447,32 +353,18 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Count all visited nodes and return a list of nodes only: /// Count all visited nodes and return a list of nodes only:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalVisitorCountAndList} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalVisitorCountAndList}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = '{ "startVertex": "' + a + '", '; /// var body = '{ "startVertex": "' + a + '", ';
/// body += '"edgeCollection" : "' + knows.name() + '", '; /// body += '"graphName" : "' + g.__name + '", ';
/// body += '"direction" : "outbound", '; /// body += '"direction" : "outbound", ';
/// body += '"init" : "result.visited = 0; result.myVertices = [ ];", '; /// body += '"init" : "result.visited = 0; result.myVertices = [ ];", ';
/// body += '"visitor" : "result.visited++; result.myVertices.push(vertex);"}'; /// body += '"visitor" : "result.visited++; result.myVertices.push(vertex);"}';
@ -481,36 +373,22 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Expand only inbound edges of `Alice` and outbound edges of `Eve`: /// Expand only inbound edges of `Alice` and outbound edges of `Eve`:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalVisitorExpander} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalVisitorExpander}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = { /// var body = {
/// startVertex: a, /// startVertex: a,
/// edgeCollection: knows.name(), /// graphName: g.__name,
/// expander: "var connections = [ ];" + /// expander: "var connections = [ ];" +
/// "if (vertex.name === \"Alice\") {" + /// "if (vertex.name === \"Alice\") {" +
/// "config.edgeCollection.inEdges(vertex).forEach(function (e) {" + /// "config.getInEdges(vertex).forEach(function (e) {" +
/// "connections.push({ " + /// "connections.push({ " +
/// "vertex: require(\"internal\").db._document(e._from), " + /// "vertex: require(\"internal\").db._document(e._from), " +
/// "edge: e" + /// "edge: e" +
@ -518,7 +396,7 @@ function notFound (req, res, code, message) {
/// "});" + /// "});" +
/// "}" + /// "}" +
/// "if (vertex.name === \"Eve\") {" + /// "if (vertex.name === \"Eve\") {" +
/// "config.edgeCollection.outEdges(vertex).forEach(function (e) {" + /// "config.getOutEdges(vertex).forEach(function (e) {" +
/// "connections.push({" + /// "connections.push({" +
/// "vertex: require(\"internal\").db._document(e._to), " + /// "vertex: require(\"internal\").db._document(e._to), " +
/// "edge: e" + /// "edge: e" +
@ -532,33 +410,19 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Follow the `depthfirst` strategy: /// Follow the `depthfirst` strategy:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalDepthFirst} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalDepthFirst}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = { /// var body = {
/// startVertex: a, /// startVertex: a,
/// edgeCollection: knows.name(), /// graphName: g.__name,
/// direction: "any", /// direction: "any",
/// strategy: "depthfirst" /// strategy: "depthfirst"
/// }; /// };
@ -567,33 +431,19 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Using `postorder` ordering: /// Using `postorder` ordering:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalPostorder} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalPostorder}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = { /// var body = {
/// startVertex: a, /// startVertex: a,
/// edgeCollection: knows.name(), /// graphName: g.__name,
/// direction: "any", /// direction: "any",
/// order: "postorder" /// order: "postorder"
/// }; /// };
@ -602,29 +452,15 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Using `backward` item-ordering: /// Using `backward` item-ordering:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalBackwardItemOrder} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalBackwardItemOrder}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = { /// var body = {
/// startVertex: a, /// startVertex: a,
@ -637,34 +473,20 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// Edges should only be included once globally, /// Edges should only be included once globally,
/// but nodes are included every time they are visited: /// but nodes are included every time they are visited:
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalEdgeUniqueness} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalEdgeUniqueness}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce);
/// var users = db._create(cv);
/// var knows = db._createEdgeCollection(ce);
/// var a = users.save({name: "Alice"})._id;
/// var b = users.save({name: "Bob"})._id;
/// var c = users.save({name: "Charlie"})._id;
/// var d = users.save({name: "Dave"})._id;
/// var e = users.save({name: "Eve"})._id;
/// knows.save(a, b, {});
/// knows.save(b, c, {});
/// knows.save(b, d, {});
/// knows.save(e, a, {});
/// knows.save(e, b, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = { /// var body = {
/// startVertex: a, /// startVertex: a,
/// edgeCollection: knows.name(), /// graphName: g.__name,
/// direction: "any", /// direction: "any",
/// uniqueness: { /// uniqueness: {
/// vertices: "none", /// vertices: "none",
@ -676,8 +498,7 @@ function notFound (req, res, code, message) {
/// assert(response.code === 200); /// assert(response.code === 200);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
/// ///
/// If the underlying graph is cyclic, `maxIterations` should be set: /// If the underlying graph is cyclic, `maxIterations` should be set:
@ -689,20 +510,17 @@ function notFound (req, res, code, message) {
/// ///
/// ///
/// @EXAMPLE_ARANGOSH_RUN{RestTraversalMaxIterations} /// @EXAMPLE_ARANGOSH_RUN{RestTraversalMaxIterations}
/// var cv = "persons"; /// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var ce = "knows"; /// var g = examples.loadGraph("knows_graph");
/// db._drop(cv); /// var a = g.persons.document("alice")._id;
/// db._drop(ce); /// var b = g.persons.document("bob")._id;
/// var users = db._create(cv); /// g.knows.truncate();
/// var knows = db._createEdgeCollection(ce); /// g.knows.save(a, b, {});
/// var a = users.save({name: "Alice"})._id; /// g.knows.save(b, a, {});
/// var b = users.save({name: "Bob"})._id;
/// knows.save(a, b, {});
/// knows.save(b, a, {});
/// var url = "/_api/traversal"; /// var url = "/_api/traversal";
/// var body = { /// var body = {
/// startVertex: a, /// startVertex: a,
/// edgeCollection: knows.name(), /// graphName: g.__name,
/// direction: "any", /// direction: "any",
/// uniqueness: { /// uniqueness: {
/// vertices: "none", /// vertices: "none",
@ -715,8 +533,7 @@ function notFound (req, res, code, message) {
/// assert(response.code === 500); /// assert(response.code === 500);
/// ///
/// logJsonResponse(response); /// logJsonResponse(response);
/// db._drop(cv); /// examples.dropGraph("knows_graph");
/// db._drop(ce);
/// @END_EXAMPLE_ARANGOSH_RUN /// @END_EXAMPLE_ARANGOSH_RUN
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -742,26 +559,43 @@ function post_api_traversal(req, res) {
catch (err) { catch (err) {
return notFound(req, res, arangodb.ERROR_ARANGO_DOCUMENT_NOT_FOUND, "invalid startVertex"); return notFound(req, res, arangodb.ERROR_ARANGO_DOCUMENT_NOT_FOUND, "invalid startVertex");
} }
// check edge collection
// -----------------------------------------
if (json.edgeCollection === undefined ||
typeof json.edgeCollection !== "string") {
return badParam(req, res, "missing or invalid edgeCollection");
}
var datasource;
var edgeCollection; var edgeCollection;
try {
edgeCollection = db._collection(json.edgeCollection); if (json.graphName === undefined) {
} // check edge collection
catch (err2) { // -----------------------------------------
if (json.edgeCollection === undefined) {
return badParam(req, res, "missing graphname");
}
if (typeof json.edgeCollection !== "string") {
return badParam(req, res, "invalid edgecollection");
}
try {
edgeCollection = db._collection(json.edgeCollection);
datasource = traversal.collectionDatasourceFactory(edgeCollection);
}
catch (ignore) {
}
if (edgeCollection === undefined ||
edgeCollection === null) {
return notFound(req, res, arangodb.ERROR_ARANGO_COLLECTION_NOT_FOUND,
"invalid edgeCollection");
}
} else if (typeof json.graphName !== "string") {
return badParam(req, res, "invalid graphname");
} else {
if (!graph._exists(json.graphName)) {
return badParam(req, res, "invalid graphname");
}
datasource = traversal.generalGraphDatasourceFactory(json.graphName);
} }
if (edgeCollection === undefined ||
edgeCollection === null) {
return notFound(req, res, arangodb.ERROR_ARANGO_COLLECTION_NOT_FOUND, "invalid edgeCollection");
}
// set up filters // set up filters
// ----------------------------------------- // -----------------------------------------
@ -844,8 +678,7 @@ function post_api_traversal(req, res) {
var config = { var config = {
params: json, params: json,
edgeCollection: edgeCollection, datasource: datasource,
datasource: traversal.collectionDatasourceFactory(edgeCollection),
strategy: json.strategy, strategy: json.strategy,
order: json.order, order: json.order,
itemOrder: json.itemOrder, itemOrder: json.itemOrder,
@ -858,6 +691,10 @@ function post_api_traversal(req, res) {
maxIterations: json.maxIterations, maxIterations: json.maxIterations,
uniqueness: json.uniqueness uniqueness: json.uniqueness
}; };
if (edgeCollection !== undefined) {
config.edgeCollection = edgeCollection;
}
// assemble result object // assemble result object
// ----------------------------------------- // -----------------------------------------

View File

@ -31,6 +31,23 @@
var Graph = require("org/arangodb/general-graph"); var Graph = require("org/arangodb/general-graph");
var createTraversalExample = function() {
var g = Graph._create("knows_graph",
[Graph._undirectedRelationDefinition("knows", "persons")]
);
var a = g.persons.save({name: "Alice", _key: "alice"})._id;
var b = g.persons.save({name: "Bob", _key: "bob"})._id;
var c = g.persons.save({name: "Charlie", _key: "charlie"})._id;
var d = g.persons.save({name: "Dave", _key: "dave"})._id;
var e = g.persons.save({name: "Eve", _key: "eve"})._id;
g.knows.save(a, b, {});
g.knows.save(b, c, {});
g.knows.save(b, d, {});
g.knows.save(e, a, {});
g.knows.save(e, b, {});
return g;
};
var createSocialGraph = function() { var createSocialGraph = function() {
var edgeDefinition = []; var edgeDefinition = [];
edgeDefinition.push(Graph._undirectedRelationDefinition("relation", ["female", "male"])); edgeDefinition.push(Graph._undirectedRelationDefinition("relation", ["female", "male"]));
@ -72,14 +89,15 @@
var dropGraph = function(name) { var dropGraph = function(name) {
return Graph._drop(name); if (Graph._exists(name)) {
return Graph._drop(name, true);
}
}; };
var loadGraph = function(name) { var loadGraph = function(name) {
if (Graph._exists(name)) {
dropGraph(name);
}
switch (name) { switch (name) {
case "knows_graph":
return createTraversalExample();
case "routeplanner": case "routeplanner":
return createRoutePlannerGraph(); return createRoutePlannerGraph();
case "social": case "social":

View File

@ -25,6 +25,7 @@
/// Copyright holder is triAGENS GmbH, Cologne, Germany /// Copyright holder is triAGENS GmbH, Cologne, Germany
/// ///
/// @author Jan Steemann /// @author Jan Steemann
/// @author Michael Hackstein
/// @author Copyright 2011-2013, triAGENS GmbH, Cologne, Germany /// @author Copyright 2011-2013, triAGENS GmbH, Cologne, Germany
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -47,7 +48,7 @@ var ArangoTraverser;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
function clone (obj) { function clone (obj) {
if (obj === null || typeof(obj) !== "object") { if (obj === null || typeof obj !== "object") {
return obj; return obj;
} }