我有一个带有几百万个顶点和几亿个边缘的orientdb数据库。一些顶点有数十万个边缘与它们相关联。
我想在此图表上执行随机漫步。我们现在满足于简单的随机漫步。
为实现这一目标,我的目标是能够选择附加到特定顶点的随机边缘。做这个的最好方式是什么?
假设我在#17:0处有一个高度连接的“元数据”类顶点。
我有一堆轻微连接的顶点类“文档”。
我有一个边缘类“metadata_of”
元数据#17:0具有200,000个“metadata_of”边缘,将其连接到200,000个不同的文档顶点。
我想从元数据对象,通过随机选择的metadata_of对象,到相应的文档对象。
我原本希望能够运行随机排序,以便能够取回一个随机边缘,但随机功能似乎是2014年1月提交的待定增强 - https://github.com/orientechnologies/orientdb/issues/1946并且有自2015年6月以来一直没有明显的活动。
似乎有一种可能的方法是检索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]
在给定特定顶点的情况下,选择随机边缘的最明智的方法是什么?
答案 0 :(得分:1)
我在javascript中使用@rid like参数创建了以下函数:
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;
您可以通过这种方式在工作室中调用该功能:
select expand(getRandomEdge(12:0)) from (select getRandomEdge(12:0))
P.S注意插入有效的@rid