OrientDB:概率加权边和遍历
OrientDB: probability-weighted edges and traversal
给定一个包含 6 个节点(A、B、C、D、E、F)的示例图
和有向边 [A,B], [B,A], [A,D], [D,A], [B,C], [C,B], [B,E], [E、B]、[C、F]、[F、C]。边是 "weighted",概率值是浮点数,介于 0 和 1 之间。
create class Node extends V;
create property Node.value string;
insert into Node (value) values ('A');
insert into Node (value) values ('B');
insert into Node (value) values ('C');
insert into Node (value) values ('D');
insert into Node (value) values ('E');
insert into Node (value) values ('F');
create class PE extends E;
create property PE.probability float;
create edge PE
from (select from Node where value = 'A')
to (select from Node where value = 'B')
set probability = 0.9;
create edge PE
from (select from Node where value = 'B')
to (select from Node where value = 'A')
set probability = 0.4;
create edge PE
from (select from Node where value = 'A')
to (select from Node where value = 'D')
set probability = 0.85;
create edge PE
from (select from Node where value = 'D')
to (select from Node where value = 'A')
set probability = 0.85;
create edge PE
from (select from Node where value = 'B')
to (select from Node where value = 'E')
set probability = 0.9;
create edge PE
from (select from Node where value = 'E')
to (select from Node where value = 'B')
set probability = 0.9;
create edge PE
from (select from Node where value = 'B')
to (select from Node where value = 'C')
set probability = 0.4;
create edge PE
from (select from Node where value = 'C')
to (select from Node where value = 'B')
set probability = 0.9;
create edge PE
from (select from Node where value = 'C')
to (select from Node where value = 'F')
set probability = 0.8;
create edge PE
from (select from Node where value = 'F')
to (select from Node where value = 'C')
set probability = 0.8;
遍历图非常简单,returns 所有六个节点。
-- traverse from D
select from (
traverse out()
from (
select from Node where value = 'D'
)
);
但我真正想要的是只遍历聚合路径概率 >= 0.5 (50%) 的节点。我认为以下内容很接近,但 returns 没什么
select from (
traverse out()[p = $aggp]
from (
select from Node where value = 'D'
)
while p >= 0.5
)
let $aggp = eval($current.inE().probability * $parent.p);
我是不是漏掉了一些显而易见的东西?我正在寻找 returns 只是 A、B、D、E 的图遍历,因为边 B->C 分配的概率为 0.4,所以路径 D->A->B-> 的总概率C = 0.85 * 0.9 * 0.4 = 0.3 < 0.5.
试试这个以节点 D 的 @rid 作为参数的 JS 函数
var g=orient.getGraph();
var nodes = [];
var previous=[];
var currently=[];
var paths=new Array;
var pathsProbability=[];
var b=g.command("sql","select from Node where @rid = " + rid);
var step=1;
var defaultProbability=1.0;
if(b.length>0){
var vertex=b[0];
previous.push(vertex);
nodes.push(vertex);
paths[0]=new Array(vertex);
pathsProbability.push(defaultProbability);
do{
for(i=0;i<previous.length;i++){
var vertexOut=previous[i];
var edges=g.command("sql","select expand(outE()) from Node where @rid = "+ vertexOut.getId());
for(j=0;j<edges.length;j++){
var edge=edges[j];
var vIn=edge.getProperty("in");
if(!check(vIn)){
var probability=edge.getProperty("probability");
setPaths(vertexOut, vIn,probability);
}
}
}
removePaths();
step++;
change();
}while(previous.length>0);
return nodes;
}
function check(vIn) {
for(y=0;y<nodes.length;y++){
var idNode=nodes[y].getId().toString();
var idIn=vIn.getId().toString();
if(idNode==idIn)
return true;
}
}
function setPaths(vOut, vIn,prob){
for (m = 0; m < paths.length; m++) {
var length=paths[m].length;
var list = paths[m];
var last = list[length - 1];
var lastId=last.getId().toString();
var idOut=vOut.getId().toString();
if (lastId==idOut) {
if (pathsProbability[m] * prob >= 0.5) {
var listVertex=[];
for (k=0;k<list.length;k++) {
listVertex.push(list[k]);
}
listVertex.push(vIn);
paths[paths.length]=listVertex;
pathsProbability.push(pathsProbability[m]*prob);
nodes.push(vIn);
currently.push(vIn);
return;
}
}
}
}
function change(){
previous=[];
for (indice=0;indice<currently.length;indice++)
previous.push(currently[indice]);
currently=[];
}
function removePaths(){
for(i=0;i<paths.length;i++){
if(paths[i].length==step){
paths.splice(i, 1);
pathsProbability.splice(i, 1);
i--;
}
}
}
给定一个包含 6 个节点(A、B、C、D、E、F)的示例图
和有向边 [A,B], [B,A], [A,D], [D,A], [B,C], [C,B], [B,E], [E、B]、[C、F]、[F、C]。边是 "weighted",概率值是浮点数,介于 0 和 1 之间。
create class Node extends V;
create property Node.value string;
insert into Node (value) values ('A');
insert into Node (value) values ('B');
insert into Node (value) values ('C');
insert into Node (value) values ('D');
insert into Node (value) values ('E');
insert into Node (value) values ('F');
create class PE extends E;
create property PE.probability float;
create edge PE
from (select from Node where value = 'A')
to (select from Node where value = 'B')
set probability = 0.9;
create edge PE
from (select from Node where value = 'B')
to (select from Node where value = 'A')
set probability = 0.4;
create edge PE
from (select from Node where value = 'A')
to (select from Node where value = 'D')
set probability = 0.85;
create edge PE
from (select from Node where value = 'D')
to (select from Node where value = 'A')
set probability = 0.85;
create edge PE
from (select from Node where value = 'B')
to (select from Node where value = 'E')
set probability = 0.9;
create edge PE
from (select from Node where value = 'E')
to (select from Node where value = 'B')
set probability = 0.9;
create edge PE
from (select from Node where value = 'B')
to (select from Node where value = 'C')
set probability = 0.4;
create edge PE
from (select from Node where value = 'C')
to (select from Node where value = 'B')
set probability = 0.9;
create edge PE
from (select from Node where value = 'C')
to (select from Node where value = 'F')
set probability = 0.8;
create edge PE
from (select from Node where value = 'F')
to (select from Node where value = 'C')
set probability = 0.8;
遍历图非常简单,returns 所有六个节点。
-- traverse from D
select from (
traverse out()
from (
select from Node where value = 'D'
)
);
但我真正想要的是只遍历聚合路径概率 >= 0.5 (50%) 的节点。我认为以下内容很接近,但 returns 没什么
select from (
traverse out()[p = $aggp]
from (
select from Node where value = 'D'
)
while p >= 0.5
)
let $aggp = eval($current.inE().probability * $parent.p);
我是不是漏掉了一些显而易见的东西?我正在寻找 returns 只是 A、B、D、E 的图遍历,因为边 B->C 分配的概率为 0.4,所以路径 D->A->B-> 的总概率C = 0.85 * 0.9 * 0.4 = 0.3 < 0.5.
试试这个以节点 D 的 @rid 作为参数的 JS 函数
var g=orient.getGraph();
var nodes = [];
var previous=[];
var currently=[];
var paths=new Array;
var pathsProbability=[];
var b=g.command("sql","select from Node where @rid = " + rid);
var step=1;
var defaultProbability=1.0;
if(b.length>0){
var vertex=b[0];
previous.push(vertex);
nodes.push(vertex);
paths[0]=new Array(vertex);
pathsProbability.push(defaultProbability);
do{
for(i=0;i<previous.length;i++){
var vertexOut=previous[i];
var edges=g.command("sql","select expand(outE()) from Node where @rid = "+ vertexOut.getId());
for(j=0;j<edges.length;j++){
var edge=edges[j];
var vIn=edge.getProperty("in");
if(!check(vIn)){
var probability=edge.getProperty("probability");
setPaths(vertexOut, vIn,probability);
}
}
}
removePaths();
step++;
change();
}while(previous.length>0);
return nodes;
}
function check(vIn) {
for(y=0;y<nodes.length;y++){
var idNode=nodes[y].getId().toString();
var idIn=vIn.getId().toString();
if(idNode==idIn)
return true;
}
}
function setPaths(vOut, vIn,prob){
for (m = 0; m < paths.length; m++) {
var length=paths[m].length;
var list = paths[m];
var last = list[length - 1];
var lastId=last.getId().toString();
var idOut=vOut.getId().toString();
if (lastId==idOut) {
if (pathsProbability[m] * prob >= 0.5) {
var listVertex=[];
for (k=0;k<list.length;k++) {
listVertex.push(list[k]);
}
listVertex.push(vIn);
paths[paths.length]=listVertex;
pathsProbability.push(pathsProbability[m]*prob);
nodes.push(vIn);
currently.push(vIn);
return;
}
}
}
}
function change(){
previous=[];
for (indice=0;indice<currently.length;indice++)
previous.push(currently[indice]);
currently=[];
}
function removePaths(){
for(i=0;i<paths.length;i++){
if(paths[i].length==step){
paths.splice(i, 1);
pathsProbability.splice(i, 1);
i--;
}
}
}