mirror of https://gitee.com/bigwinds/arangodb
Add some graph generators and a CSV_exporter.
This commit is contained in:
parent
84f1ae1659
commit
cbd61804df
|
@ -0,0 +1,126 @@
|
|||
// This is a generic CSV exporter for collections.
|
||||
//
|
||||
// Usage: Run with arangosh like this:
|
||||
// arangosh --javascript.execute <CollName> [ <Field1> <Field2> ... ]
|
||||
//
|
||||
// This will take all documents in the collection with name <CollName>
|
||||
// and export a CSV file with a row for each document. Fields are
|
||||
// specified by either simply giving their name, or in the form
|
||||
// <name>:<somestring>
|
||||
// in which case the column header is the whole string but only the
|
||||
// attribute with name <name> will be taken. This is in particular
|
||||
// intended for data for neo4j, where there are type attributes after
|
||||
// the colon. If the first letter of <name> is a "!", then it does
|
||||
// not refer to an attribute name and the constant value of the string
|
||||
// after the "!" is put into the corresponding column.
|
||||
// If no fields are specified, then the tool guesses fields by
|
||||
// inspecting the collection and a random document. It does know
|
||||
// about edge collections in that case and does "something sensible"
|
||||
// for export to neo4j in that case.
|
||||
|
||||
function format(x) {
|
||||
if (typeof(x) === "string") {
|
||||
return '"'+x+'"';
|
||||
}
|
||||
else if (typeof(x) === "object") {
|
||||
return '"'+JSON.stringify(x)+'"';
|
||||
}
|
||||
else if (typeof(x) === "undefined") {
|
||||
return "undefined";
|
||||
}
|
||||
else {
|
||||
return x.toString();
|
||||
}
|
||||
}
|
||||
|
||||
function type(x) {
|
||||
if (typeof(x) === "string") {
|
||||
return "string";
|
||||
}
|
||||
else if (typeof(x) === "number") {
|
||||
return "double";
|
||||
}
|
||||
else if (typeof(x) === "boolean") {
|
||||
return "boolean";
|
||||
}
|
||||
else {
|
||||
return "string";
|
||||
}
|
||||
}
|
||||
|
||||
function CSVExport (collName, fields, names) {
|
||||
var l = "";
|
||||
for (i = 0; i < fields.length; i++) {
|
||||
if (i > 0) {
|
||||
l += ",";
|
||||
}
|
||||
l += names[i];
|
||||
}
|
||||
print(l);
|
||||
|
||||
var q = db._query('FOR d IN '+collName+' RETURN d');
|
||||
var n;
|
||||
while (q.hasNext()) {
|
||||
n = q.next();
|
||||
if (fields[0][0] === "!") {
|
||||
l = format(fields[0].substr(1));
|
||||
}
|
||||
else {
|
||||
l = format(n[fields[0]]);
|
||||
}
|
||||
for (i = 1; i < fields.length; i++) {
|
||||
if (fields[i][0] === "!") {
|
||||
l += "," + fields[i].substr(1);
|
||||
}
|
||||
else {
|
||||
l += "," + format(n[fields[i]]);
|
||||
}
|
||||
}
|
||||
print(l);
|
||||
}
|
||||
}
|
||||
|
||||
var collName = ARGUMENTS[0];
|
||||
var fields = [];
|
||||
var names = [];
|
||||
|
||||
var i;
|
||||
|
||||
if (ARGUMENTS.length > 1) {
|
||||
for (i = 1; i < ARGUMENTS.length; i++) {
|
||||
var f = ARGUMENTS[i];
|
||||
var pos = f.indexOf(":");
|
||||
if (pos < 0) {
|
||||
fields.push(f);
|
||||
names.push(f);
|
||||
}
|
||||
else {
|
||||
names.push(f);
|
||||
fields.push(f.substr(0, pos));
|
||||
}
|
||||
}
|
||||
}
|
||||
else { // try to be clever:
|
||||
var c = db._collection(collName);
|
||||
var d = c.any();
|
||||
var itsFields = Object.keys(d);
|
||||
itsFields = itsFields.filter(function(s) { return s[0] !== "_"; });
|
||||
if (c.type() === 2) { // document-collection
|
||||
fields.push("_id");
|
||||
names.push("_id:ID");
|
||||
}
|
||||
else { // edge-collection
|
||||
fields.push("_from");
|
||||
names.push("_from:START_ID");
|
||||
fields.push("_to");
|
||||
names.push("_to:END_ID");
|
||||
fields.push("!EDGE");
|
||||
names.push(":TYPE");
|
||||
}
|
||||
for (i = 0; i < itsFields.length; i++) {
|
||||
fields.push(itsFields[i]);
|
||||
names.push(itsFields[i]+":"+type(d[itsFields[i]]));
|
||||
}
|
||||
}
|
||||
CSVExport(collName, fields, names);
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
function makeCircle(Vname, Ename, prefix, N) {
|
||||
var db = require("internal").db;
|
||||
db._drop(Vname);
|
||||
db._drop(Ename);
|
||||
var V = db._create(Vname);
|
||||
var E = db._createEdgeCollection(Ename);
|
||||
var i;
|
||||
for (i = 1; i <= N; i++) {
|
||||
V.insert({_key: prefix + i, nr: i});
|
||||
}
|
||||
for (i = 1; i < N; i++) {
|
||||
E.insert(Vname+"/"+prefix+i, Vname+"/"+prefix+(i+1), {_key:prefix+i});
|
||||
}
|
||||
E.insert(Vname+"/"+prefix+N, Vname+"/"+prefix+1, {_key: prefix+N});
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
function makeName (x, y) {
|
||||
return "X"+x+"Y"+y;
|
||||
}
|
||||
|
||||
function makeGrid (Vname, Ename, n) {
|
||||
var db = require("internal").db;
|
||||
db._drop(Vname);
|
||||
db._drop(Ename);
|
||||
var V = db._create(Vname);
|
||||
var E = db._createEdgeCollection(Ename);
|
||||
var x, y;
|
||||
for (x = 0; x < n; x++) {
|
||||
for (y = 0; y < n; y++) {
|
||||
V.insert({x:x, y:y, _key: makeName(x, y)});
|
||||
}
|
||||
}
|
||||
// The horizontal edges:
|
||||
for (y = 0; y < n; y++) {
|
||||
for (x = 0; x < n-1; x++) {
|
||||
E.insert(Vname+"/"+makeName(x,y), Vname+"/"+makeName(x+1,y),
|
||||
{_key: "H"+makeName(x,y)});
|
||||
}
|
||||
}
|
||||
// The vertical edges:
|
||||
for (x = 0; x < n; x++) {
|
||||
for (y = 0; y < n-1; y++) {
|
||||
E.insert(Vname+"/"+makeName(x,y), Vname+"/"+makeName(x,y+1),
|
||||
{_key: "V"+makeName(x,y)});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
function makeRandomGraph (Vname, Ename, nV, nE) {
|
||||
var db = require("internal").db;
|
||||
db._drop(Vname);
|
||||
db._drop(Ename);
|
||||
var V = db._create(Vname);
|
||||
var E = db._createEdgeCollection(Ename);
|
||||
var x, y;
|
||||
var i;
|
||||
for (i = 0; i < nV; i++) {
|
||||
V.insert({_key: "X"+i});
|
||||
}
|
||||
for (i = 0;i < nE; i++) {
|
||||
x = Math.floor(Math.random() * nV);
|
||||
y = Math.floor(Math.random() * nV);
|
||||
E.insert(Vname+"/X"+x, Vname+"/X"+y, {_key: "Y"+i});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
function makeTree(Vname, Ename, prefix, N, rev) {
|
||||
var db = require("internal").db;
|
||||
var V = db._collection(Vname);
|
||||
var E = db._collection(Ename);
|
||||
var i;
|
||||
for (i = 1; i <= Math.pow(2,N)-1; i++) {
|
||||
V.insert({_key: prefix + i, nr: i});
|
||||
}
|
||||
for (i = 1; i <= Math.pow(2,N-1)-1; i++) {
|
||||
[2*i, 2*i+1].forEach(function(j) {
|
||||
if (j < Math.pow(2,N)) {
|
||||
if (! rev) {
|
||||
E.insert(Vname+"/"+prefix+i, Vname+"/"+prefix+j,
|
||||
{_key: prefix + j });
|
||||
}
|
||||
else {
|
||||
E.insert(Vname+"/"+prefix+j, Vname+"/"+prefix+i,
|
||||
{_key: prefix + j });
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function makeTreeGraph (Vname, Ename, prefix, n) {
|
||||
var db = require("internal").db;
|
||||
db._drop(Vname);
|
||||
db._drop(Ename);
|
||||
var V = db._create(Vname);
|
||||
var E = db._createEdgeCollection(Ename);
|
||||
makeTree(Vname, Ename, prefix+"_out", 2*n, false);
|
||||
makeTree(Vname, Ename, prefix+"_in", 2*n, true);
|
||||
E.insert(Vname+"/"+prefix+"_out"+(Math.pow(2,n)-1),
|
||||
Vname+"/"+prefix+"_in"+(Math.pow(2,n)-1),
|
||||
{_key:"special"});
|
||||
}
|
Loading…
Reference in New Issue