我尝试使用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上运行我想要的查询,它应该返回:
这个顺序是因为迈克和约翰之间的力量总和 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分钟...... :(
答案 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)