Database 图形数据库节点和边随时间变化

Database 图形数据库节点和边随时间变化,database,database-design,neo4j,orientdb,graph-databases,Database,Database Design,Neo4j,Orientdb,Graph Databases,我想将德国德甲映射为图形数据库中的结构。对于当前静态状态,这一点都没有问题: 球员与俱乐部有联系。 俱乐部通过比赛相互联系。 俱乐部被分配到联赛。 然而,我想引入时间维度: 例如,第三联赛从2008年才开始存在。在那之前,联盟的结构完全不同。 球员更换俱乐部 我如何在图形数据库中映射它? 不幸的是,我在OrientDB这样的多模型数据库中没有发现任何东西。典型的方法是从/有效到顶点和边上的属性。然后,您可以在查询图形时过滤这些属性 例如 在图形数据库中添加时间维度节点和边是一种非常常见的设计模式

我想将德国德甲映射为图形数据库中的结构。对于当前静态状态,这一点都没有问题:

球员与俱乐部有联系。 俱乐部通过比赛相互联系。 俱乐部被分配到联赛。 然而,我想引入时间维度:

例如,第三联赛从2008年才开始存在。在那之前,联盟的结构完全不同。 球员更换俱乐部 我如何在图形数据库中映射它?
不幸的是,我在OrientDB这样的多模型数据库中没有发现任何东西。

典型的方法是从/有效到顶点和边上的属性。然后,您可以在查询图形时过滤这些属性

例如


在图形数据库中添加时间维度节点和边是一种非常常见的设计模式。它允许您捕获数据的所有状态,然后查看特定时间点或时间范围内的数据

下面是一个无穷图解决方案:

UPDATE SCHEMA {
   CREATE CLASS Team {
      name    : String,
      players : LIST {
                    element: Reference {
                    edgeClass  : PlaysFor,
                    edgeAttribute   : player
                    }, 
                  CollectionTypeName : SegmentedArray
                }
  }
  CREATE CLASS Player {
     name      : String,
     playsFor  : LIST {
                    element: Reference {
                       edgeClass : PlaysFor,
                       edgeAttribute  : team
                    },
                    CollectionTypeName : SegmentedArray
                  }
  }
  CREATE CLASS PlaysFor {
      dateFrom : Date,
      dateTo   : Date,
      team     : Reference {referenced: Team, inverse: players },
      player   : Reference {referenced: Player,  inverse: playsFor }
   }
};
//---------------------------------- Result ------------------------------------
Done.
创建一些球员和球队数据

let teamHKiel = CREATE Team { name: "Holstein Kiel" };   
let teamMainz = CREATE Team { name: "FVZ Mainz 05 II" };
let teamSpVgg = CREATE Team { name: "SpVgg Unterhaching" };

let playerRZ = CREATE Player { name: "Robin Zentner" };
let playerAH = CREATE Player { name: "Alexander Hack" };
将球员与他们的球队联系起来,确定具体的日期范围

CREATE PlaysFor { 
      player: $playerRZ, team: $teamMainz, 
      dateFrom: 2014-08-02, dateTo: 2015-08-01 
};
//---------------------------------- Result ------------------------------------
3-3-1-14


CREATE PlaysFor { 
       player: $playerRZ, team: $teamHKiel, 
       dateFrom: 2015-08-02, dateTo: 2016-08-01 
};
//---------------------------------- Result ------------------------------------
3-3-1-19

CREATE PlaysFor { 
       player: $playerAH, team: $teamMainz, 
       dateFrom: 2014-07-02, dateTo: 2017-06-01 
};
//---------------------------------- Result ------------------------------------
3-3-1-22

CREATE PlaysFor { 
       player: $playerAH, team: $teamSpVgg, 
       dateFrom: 2013-07-02, dateTo: 2014-07-01 
};
//---------------------------------- Result ------------------------------------
3-3-1-25
罗宾·曾特纳在2016-05-01为哪支球队效力

LET d = 2016-05-01;
MATCH path = (p:Player {name == 'Robin Zentner'}) 
             -[:PlaysFor {dateFrom < $d AND dateTo > $d}]->(t:Team) 
        RETURN p.name as player, t.name as team;
//---------------------------------- Result ------------------------------------
{
  _Projection
  {
    player:'Robin Zentner',
    team:'Holstein Kiel'
  }
}
罗宾·曾特纳在2015-05-01为哪支球队效力

MATCH path = (p:Player {name == 'Robin Zentner'}) 
            -[:PlaysFor {dateFrom < $d AND dateTo > $d}]->(t:Team) 
            RETURN p.name as player, t.name as team;
//---------------------------------- Result ------------------------------------                  
{
  _Projection
  {
    player:'Robin Zentner',
    team:'FVZ Mainz 05 II'
  }
}
2015年3月1日,谁为FVZ美因茨05 II效力

LET d = 2015-03-01;
//---------------------------------- Result ------------------------------------
Done.

MATCH path = (t:Team {name == 'FVZ Mainz 05 II'}) 
             -[:PlaysFor {dateFrom < $d AND dateTo > $d}]-> 
             (p:Player) 
             RETURN p.name as player, t.name as team;
//---------------------------------- Result ------------------------------------

{
  _Projection
  {
    player:'Robin Zentner',
    team:'FVZ Mainz 05 II'
  },
  _Projection
  {
    player:'Alexander Hack',
    team:'FVZ Mainz 05 II'
  }
}

InfiniteGraph

当然,在有意义的顶点上也可以这样做
MATCH path = (p:Player {name == 'Robin Zentner'}) 
            -[:PlaysFor {dateFrom < $d AND dateTo > $d}]->(t:Team) 
            RETURN p.name as player, t.name as team;
//---------------------------------- Result ------------------------------------                  
{
  _Projection
  {
    player:'Robin Zentner',
    team:'FVZ Mainz 05 II'
  }
}
LET d = 2015-03-01;
//---------------------------------- Result ------------------------------------
Done.

MATCH path = (t:Team {name == 'FVZ Mainz 05 II'}) 
             -[:PlaysFor {dateFrom < $d AND dateTo > $d}]-> 
             (p:Player) 
             RETURN p.name as player, t.name as team;
//---------------------------------- Result ------------------------------------

{
  _Projection
  {
    player:'Robin Zentner',
    team:'FVZ Mainz 05 II'
  },
  _Projection
  {
    player:'Alexander Hack',
    team:'FVZ Mainz 05 II'
  }
}