我使用OETL从RDMBS将分层数据导入OrientDB。在RDBMS中,我们曾经将parentId存储在同一行中。 例如表结构是这样的:
ID - 名称 - Parent_ID
Corp - Corporate Office - Corp
D1 - 地区办事处1 - Corp
D2 - 地区办事处2 - Corp
SO1 - 小型办公室1 - D1
SO2 - 小型办公室2 - D2
SO3 - 小型办公室3 - D1
现在每一行都是Orientdb中的一个节点。
我想创建一个边缘(ParentOf),从公司说到D1,D1到SO1,依此类推。
如何编写查询来实现此目的?沿袭这条线的东西?
从(从节点中选择)a到(从节点中选择)创建边缘parentOf 其中a.id = parent_id)
抱歉,我仍然在考虑关系数据库方式。
Orient DB版本是orientdb-community-2.0.9
答案 0 :(得分:1)
感谢pembeci,以下是最终成功的功能:
var db = orient.getGraph();
var nodes = db.getVerticesOfClass("nodex");
var itr = nodes.iterator();
while(itr.hasNext()) {
var vertex = itr.next();
var id = vertex.getProperty("id");
var children = db.getVertices("parent_id", id);
var childItr = children.iterator();
while(childItr.hasNext()) {
var child = childItr.next();
vertex.addEdge("parentOf", child);
}
}
答案 1 :(得分:0)
您无法将信息从第一个选择查询(从部分)传递到第二个查询(部分)。所以你应该创建一个server side function。这样的东西可能会起作用(我稍后会测试它,当我可以访问Orient Studio时):
var db = orient.getGraph;
var nodes = db.getVerticesOfClass("node");
for (var i=0; i<nodes.length; i++) {
var vertex = nodes[i]
var id = vertex.getProperty("id");
var children = db.getVertices("parent_id", id);
for (var j=0; j<children.length; j++) {
var child = children[j];
vertex.addEdge("parentOf", child)
}
}
答案 2 :(得分:0)
js功能永远在运行。最后写了java代码来做到这一点:
OrientGraph graph = new OrientGraph("remote:localhost/testNode", "root", "root");
for (Vertex v : graph.getVerticesOfClass("Node"))
{
String id = v.getProperty("ID");
System.out.println("Checking children of: " + id);
String sql = "select from node where PARENT_ID = '"+id+"'";
for (Vertex child : (Iterable<Vertex>) graph.command(
new OCommandSQL(sql))
.execute())
{
v.addEdge("parent_of", child);
System.out.println("\tAdded 'Parent Of' Edge from: " + id + " to " + child.getProperty("ID"));
}
graph.commit();
}