OrientDB 访问随机边,还是特定的边索引?
OrientDB access random edge, or specific edge index?
我有一个orientdb数据库,有几百万个顶点和几亿条边。有些顶点有数十万条边与之关联。
我想在此图上执行随机游走。我们现在满足于让简单的随机游走工作。
为此,我的目标是能够选择附加到特定顶点的随机边。做这个的最好方式是什么?
假设我在#17:0 有一个高度连接的顶点 class "metadata"。
我有一堆轻连接的顶点class"documents"。
我有优势class"metadata_of"
元数据 #17:0 有 200,000 "metadata_of" 条边将它连接到 200,000 个不同的文档顶点。
我想从一个元数据对象,通过一个随机 selected metadata_of 对象,到相应的文档对象。
我曾希望能够 运行 随机顺序排序以恢复单个随机边,但随机功能似乎是 2014 年 1 月提交的待定增强功能 - https://github.com/orientechnologies/orientdb/issues/1946 并且自 2015 年 6 月以来就没有明显的 activity。
似乎解决这个问题的一种潜在方法是检索 inE 值的大小(在我的例子中),然后生成一个介于 0 和 len(inE) 之间的随机整数 i。从那里,我想从给定顶点的 inE 集合中检索 edge[i] 。我以为我在 Gremlin 中有这样的东西可以方便地工作,但在重新评估时它似乎并没有快速工作 - 相反,它似乎正在遍历 inE 列表直到它到达索引 X。通常比检索所有 200k 边缘更好,但性能不理想。
gremlin> g = new OrientGraph("remote:localhost/mydb");
Oct 06, 2015 11:03:54 PM com.orientechnologies.common.log.OLogManager log
==>orientgraph[remote:localhost/activeint]
gremlin> v1 = g.v("#17:0")
==>v(concept)[#17:0]
gremlin> v1.inE[554] (this took about 4 seconds)
==>e[#18:8628863][#13:305536-metadata_of->#17:0]
给定一个特定的顶点,select 随机边附加到它的最明智的方法是什么?
我在 javascript 中使用 @rid 类参数创建了以下函数:
var g=orient.getGraph();
var c=g.command("sql","select out('metadata_of').size() as num from "+rid);
var rand=Math.floor((Math.random() * c[0].getProperty('num')-1) + 0);
var pick=g.command("sql","select expand(out('metadata_of')['"+rand+"']) from "+rid);
return pick;
在studio中可以这样调用函数:
select expand(getRandomEdge(12:0)) from (select getRandomEdge(12:0))
P.S注意插入有效的@rid
我有一个orientdb数据库,有几百万个顶点和几亿条边。有些顶点有数十万条边与之关联。
我想在此图上执行随机游走。我们现在满足于让简单的随机游走工作。
为此,我的目标是能够选择附加到特定顶点的随机边。做这个的最好方式是什么?
假设我在#17:0 有一个高度连接的顶点 class "metadata"。
我有一堆轻连接的顶点class"documents"。
我有优势class"metadata_of"
元数据 #17:0 有 200,000 "metadata_of" 条边将它连接到 200,000 个不同的文档顶点。
我想从一个元数据对象,通过一个随机 selected metadata_of 对象,到相应的文档对象。
我曾希望能够 运行 随机顺序排序以恢复单个随机边,但随机功能似乎是 2014 年 1 月提交的待定增强功能 - https://github.com/orientechnologies/orientdb/issues/1946 并且自 2015 年 6 月以来就没有明显的 activity。
似乎解决这个问题的一种潜在方法是检索 inE 值的大小(在我的例子中),然后生成一个介于 0 和 len(inE) 之间的随机整数 i。从那里,我想从给定顶点的 inE 集合中检索 edge[i] 。我以为我在 Gremlin 中有这样的东西可以方便地工作,但在重新评估时它似乎并没有快速工作 - 相反,它似乎正在遍历 inE 列表直到它到达索引 X。通常比检索所有 200k 边缘更好,但性能不理想。
gremlin> g = new OrientGraph("remote:localhost/mydb");
Oct 06, 2015 11:03:54 PM com.orientechnologies.common.log.OLogManager log
==>orientgraph[remote:localhost/activeint]
gremlin> v1 = g.v("#17:0")
==>v(concept)[#17:0]
gremlin> v1.inE[554] (this took about 4 seconds)
==>e[#18:8628863][#13:305536-metadata_of->#17:0]
给定一个特定的顶点,select 随机边附加到它的最明智的方法是什么?
我在 javascript 中使用 @rid 类参数创建了以下函数:
var g=orient.getGraph();
var c=g.command("sql","select out('metadata_of').size() as num from "+rid);
var rand=Math.floor((Math.random() * c[0].getProperty('num')-1) + 0);
var pick=g.command("sql","select expand(out('metadata_of')['"+rand+"']) from "+rid);
return pick;
在studio中可以这样调用函数:
select expand(getRandomEdge(12:0)) from (select getRandomEdge(12:0))
P.S注意插入有效的@rid