在select语句中对order by的边缘属性求和

时间:2015-12-02 16:12:20

标签: sql graph properties orientdb edge

我尝试使用select语句通过强制连接来对结果集进行排序。

CREATE CLASS Entity EXTENDS V;
CREATE CLASS isConnectedTo EXTENDS E;

CREATE PROPERTY isConnectedTo.strength INTEGER;

' isConnectedTo' 边缘将实体与另一个实体

相关联

棘手的部分是我在同一个实体之间有双重连接:

CREATE VERTEX Entity SET name = "John";
CREATE VERTEX Entity SET name = "Mike";
CREATE VERTEX Entity SET name = "Susan";

CREATE EDGE isConnectedTo FROM (SELECT FROM Entity WHERE name = "Mike") TO (SELECT FROM Entity WHERE name = "John") SET strength = 3;
CREATE EDGE isConnectedTo FROM (SELECT FROM Entity WHERE name = "Mike") TO (SELECT FROM Entity WHERE name = "Susan") SET strength = 4;
CREATE EDGE isConnectedTo FROM (SELECT FROM Entity WHERE name = "John") TO (SELECT FROM Entity WHERE name = "Mike") SET strength = 2;

所以 Mike John 相关联,这也与他有关。 Mike 也与 Susan 相关联。

在这种情况下,如果我要在Mike上运行我想要的查询,它应该返回:

  1. 约翰
  2. 苏珊
  3. 这个顺序是因为迈克和约翰之间的力量总和 3 + 2 = 5 ,迈克和苏珊之间只有 4

    我已经通过许多可能的查询进行了迭代但无济于事,但我似乎无法确定为什么最后一个拒绝工作。

    LET $main = SELECT FROM Entity WHERE name = "John";
    LET $vset = SELECT expand(in('isConnectedTo')) FROM $main;
    SELECT @rid, eval('$ei.strength + $eo.strength') as total_strength FROM $vset
       LET $ei = (SELECT expand(inE('isConnectedTo')) FROM $current WHERE $main.@rid IN out),
       LET $eo = (SELECT expand(outE('isConnectedTo')) FROM $current WHERE $main.@rid IN in)
    ORDER BY total_strength DESC;
    

    注意:我已经获得了实体'用哈希字典索引的名称和' isConnectedTo'使用实体之间的唯一链接索引边缘(因此它们不能在同一方向上重复)

    编辑:去尝试Lvca的答案,这需要一些准备工作。但我感觉很好!

    我所做的所有其他试验或其他答案的帮助导致查询时间> = 2分钟...... :(

3 个答案:

答案 0 :(得分:2)

我想对您的域名进行一些小改动。如果两个人都已连接,则不要创建2条边,但要使用具有2个属性的相同边。

CREATE CLASS Entity EXTENDS V;
CREATE CLASS isConnectedTo EXTENDS E;
CREATE PROPERTY isConnectedTo.strengthOut INTEGER;
CREATE PROPERTY isConnectedTo.strengthIn INTEGER;

CREATE VERTEX Entity SET name = "John";
CREATE VERTEX Entity SET name = "Mike";
CREATE VERTEX Entity SET name = "Susan";

CREATE EDGE isConnectedTo FROM (SELECT FROM Entity WHERE name = "Mike") TO (SELECT FROM Entity WHERE name = "John") SET strengthOut = 3, strengthIn = 2;
CREATE EDGE isConnectedTo FROM (SELECT FROM Entity WHERE name = "Mike") TO (SELECT FROM Entity WHERE name = "Susan") SET strengthOut = 4;

在这种情况下,你有更少的边缘,你可以使用这个超快速查询:

SELECT out.name as name1, in.name as name2, eval('strengthOut + strengthIn') as strength
FROM (
  SELECT expand( bothE('isConnectedTo') ) FROM Entity WHERE name = "Mike"
) ORDER BY strength

注意:请记住在Entity.name上创建索引以加速内部查询。

答案 1 :(得分:1)

尝试此查询

select expand(rid) from (select @rid,sum($a[0].sum,$b[0].sum) as sum from Entity 
let $a= (select sum(strength) as sum from isConnectedTo where in.name="Mike" and out.name=$parent.current.name),
$b= (select sum(strength) as sum from isConnectedTo where out.name="Mike" and in.name=$parent.current.name)
where name<>"Mike" order by sum desc)

答案 2 :(得分:1)

尝试此查询:

select expand($a.rid) from (select from Entity where name="Mike")
let $a=(select @rid,sum(bothE().strength) as sum from Entity where both('isConnectedTo').name contains $parent.current.name group by name order by sum desc)