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