找到通过某条边连接到邻居的最常见顶点,并使用它和边信息来执行计算

Finding the most common vertex connected to neighbors by a certain edge and using this, and edge information, to perform calculations

我想根据一个人关注的人来判断他可能来自哪里,并将国家/地区与大致的经纬度结合起来。我有两种类型的节点:用户(包含名称,可能包含经纬度)和国家(包含名称)。我还有两种类型的边:Follow 和 LivesIn(包含 lat 和 lng)。

目前 Account 和 LivesIn 边缘都包含纬度和经度,因为我不完全确定哪里更好,但目前我倾向于将它放在边缘.

下面是一个有五个用户的示例网络。其中三个我知道他们来自哪里。现在我想做一个有根据的猜测爱丽丝来自哪里:

  1. 爱丽丝关注了四个用户
  2. 这四位用户中有两位来自德国,一位来自比利时,一位未知
  3. 我们可以假设爱丽丝来自德国
  4. 德国用户的平均纬度和经度为 (51.165691+51.115691)/2 和 (10.451526+10.481526)/2
  5. 我们可以假设 Alice 在 (51.140691; 10.466526) 附近的某个地方

.

CREATE CLASS Account EXTENDS V
CREATE PROPERTY Account.name string
CREATE PROPERTY Account.lat double
CREATE PROPERTY Account.lng double

CREATE CLASS Country EXTENDS V
CREATE PROPERTY Country.countryname string

CREATE CLASS LivesIn EXTENDS E
CREATE PROPERTY LivesIn.lat double
CREATE PROPERTY LivesIn.lng double

CREATE CLASS Follows EXTENDS E

CREATE VERTEX Account SET name='Alice'
CREATE VERTEX Account SET name='Bob', lat=50.503887, lng=4.469936  /* Belgium */
CREATE VERTEX Account SET name='Carol', lat=51.165691, lng=10.451526  /* Germany */
CREATE VERTEX Account SET name='Eve', lat=51.115691, lng=10.481526  /* Germany */
CREATE VERTEX Account SET name='Dave'

CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Alice') TO (SELECT FROM Account WHERE name='Bob')
CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Alice') TO (SELECT FROM Account WHERE name='Carol')
CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Alice') TO (SELECT FROM Account WHERE name='Eve')
CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Alice') TO (SELECT FROM Account WHERE name='Dave')

CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Bob') TO (SELECT FROM Account WHERE name='Alice')
CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Carol') TO (SELECT FROM Account WHERE name='Alice')
CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Eve') TO (SELECT FROM Account WHERE name='Alice')
CREATE EDGE Follows FROM (SELECT FROM Account WHERE name='Dave') TO (SELECT FROM Account WHERE name='Alice')

CREATE VERTEX Country SET countryname='Belgium'
CREATE VERTEX Country SET countryname='Germany'

CREATE EDGE LivesIn FROM (SELECT FROM Account WHERE name='Bob') TO (SELECT FROM Country WHERE countryname='Belgium') SET lat=50.503887, lng=4.469936
CREATE EDGE LivesIn FROM (SELECT FROM Account WHERE name='Carol') TO (SELECT FROM Country WHERE countryname='Germany') SET lat=51.165691, lng=10.451526
CREATE EDGE LivesIn FROM (SELECT FROM Account WHERE name='Eve') TO (SELECT FROM Country WHERE countryname='Germany') SET lat=51.115691, lng=10.481526

我的问题是在 OrientDB 中是否有使用特定 sql 命令实现此目的的有效方法,或者它是否需要新功能。

我想通了一些小事,比如获取所有传出 Follows 连接:

SELECT out("Follows") FROM Account WHERE name='Alice'

但我无法真正设法从那里获得所有 LivesIn 边缘。

或者我可以像他们一样在 OrientDB 中创建一个新函数 。类似于:

var gdb = orient.getGraphNoTx();
var v = gdb.command("sql", "select from Account where name='" + name + "'");
neighbours = v[0].getRecord().field("out_Follows").iterator();
var result = []
print('\n');
country_dict = {}
while(neighbours.hasNext()) {
    var neighbour = neighbours.next();
    var temp = neighbour.field("in").field("out_LivesIn");
    if(temp) {
        it = temp.iterator();
        print(it.next());
        // Count each country and keep track of sum of lat and lng so it can be divided
        // once all neighbours have been visited
    }
}

但这并没有真正使用 sql 的任何(可能有效?)内置方法。考虑到一个人可能会关注数以万计的其他帐户。

任何人都可以建议我如何解决这个问题吗?

试试这个查询

select countryname,eval('sum / _count') as average_lat,eval('sum2 / _count') as average_lng from 
(select countryname,sum(_lat),sum(_lng),count(*) as _count from 
(select outE("livesIn").lat as _lat,outE("livesIn").lng as _lng,out("livesIn").countryname as countryname from 
(select expand(out("Follows")) from Account where name="Alice") unwind _lat,_lng,countryname) 
group by countryname order by _count desc limit 1)