Gremlin Cosmos DB - 如何构建 FPS 游戏中的事件?
Gremlin Cosmos DB - How to structure events from a FPS game?
所以,我对图形和 gremlin 完全陌生 API 所以我希望这里有人能给我指出正确的方向。
我打算创建 FPS 游戏中所有事件的概览图。这意味着我有一个球员、回合和每一回合中发生的所有事件的列表。一个事件可以是;
- 玩家 1 -> 射击(武器、伤害量等附加属性将是
必需)-> 玩家 2
- 玩家 2 -> 被杀死 -> 玩家 3
等等...
我不太确定应该以哪种方式构建它。事件应该只是一条边,指向另一个玩家(顶点)吗?这意味着边缘需要额外的属性,并且需要与游戏回合相关,不确定这是否可能..?
如有任何帮助,我们将不胜感激。
再详细一点,这是一个典型的事件。
{
"attackId": 587204688,
"attacker": {
"name": "Danielsol13",
"teamId": 10,
"health": 56.031158447265625,
"location": {
"x": 218720.15625,
"y": 467373.53125,
"z": 13599.349609375
},
"ranking": 0,
"accountId": "account.46118b5fe1954e97a6af47cb6e9506af",
"isInBlueZone": false,
"isInRedZone": false,
"zone": []
},
"victim": {
"name": "BUTTZN",
"teamId": 3,
"health": 45.600002288818359,
"location": {
"x": 217836.6875,
"y": 464758.8125,
"z": 13499.73046875
},
"ranking": 0,
"accountId": "account.308db6ede78048d1aa372f6ee7b87eed",
"isInBlueZone": false,
"isInRedZone": false,
"zone": []
},
"damageTypeCategory": "Damage_Gun",
"damageReason": "HeadShot",
"damage": 45.600002288818359,
"damageCauserName": "WeapHK416_C",
"isThroughPenetrableWall": false,
"common": {
"isGame": 1.5
},
"_D": "2021-03-15T20:46:24.063Z",
"_T": "LogPlayerTakeDamage"
}
决定事件是顶点还是边时,您需要问自己的主要问题是:事件是否需要连接到 From player 顶点和 To player 顶点以外的任何顶点?
您是说事件需要与回合相关联。所以可能 Event 需要是一个顶点。除非你永远不需要在遍历中使用这种关系。
如果您永远不需要遍历 Round 和 Event 之间的这种关系,那么您可以只在 Event 边上设置一个标量 属性“RoundId”。
但是,如果您需要编写遍历,例如“根据谓词过滤轮次,然后遍历轮次事件”,那么您可能需要将事件作为顶点。
此外,如果您希望编写大量从事件开始的遍历,例如 g.V().has('event', ...)
或 g.E().has('event', ...)
,那么您可能希望事件是顶点,而不是边。因为我相信(对此我不是 100% 确定),在大多数图形数据库中,搜索顶点比搜索边缘更有效。
所以,我对图形和 gremlin 完全陌生 API 所以我希望这里有人能给我指出正确的方向。
我打算创建 FPS 游戏中所有事件的概览图。这意味着我有一个球员、回合和每一回合中发生的所有事件的列表。一个事件可以是;
- 玩家 1 -> 射击(武器、伤害量等附加属性将是 必需)-> 玩家 2
- 玩家 2 -> 被杀死 -> 玩家 3
等等...
我不太确定应该以哪种方式构建它。事件应该只是一条边,指向另一个玩家(顶点)吗?这意味着边缘需要额外的属性,并且需要与游戏回合相关,不确定这是否可能..?
如有任何帮助,我们将不胜感激。
再详细一点,这是一个典型的事件。
{
"attackId": 587204688,
"attacker": {
"name": "Danielsol13",
"teamId": 10,
"health": 56.031158447265625,
"location": {
"x": 218720.15625,
"y": 467373.53125,
"z": 13599.349609375
},
"ranking": 0,
"accountId": "account.46118b5fe1954e97a6af47cb6e9506af",
"isInBlueZone": false,
"isInRedZone": false,
"zone": []
},
"victim": {
"name": "BUTTZN",
"teamId": 3,
"health": 45.600002288818359,
"location": {
"x": 217836.6875,
"y": 464758.8125,
"z": 13499.73046875
},
"ranking": 0,
"accountId": "account.308db6ede78048d1aa372f6ee7b87eed",
"isInBlueZone": false,
"isInRedZone": false,
"zone": []
},
"damageTypeCategory": "Damage_Gun",
"damageReason": "HeadShot",
"damage": 45.600002288818359,
"damageCauserName": "WeapHK416_C",
"isThroughPenetrableWall": false,
"common": {
"isGame": 1.5
},
"_D": "2021-03-15T20:46:24.063Z",
"_T": "LogPlayerTakeDamage"
}
决定事件是顶点还是边时,您需要问自己的主要问题是:事件是否需要连接到 From player 顶点和 To player 顶点以外的任何顶点?
您是说事件需要与回合相关联。所以可能 Event 需要是一个顶点。除非你永远不需要在遍历中使用这种关系。
如果您永远不需要遍历 Round 和 Event 之间的这种关系,那么您可以只在 Event 边上设置一个标量 属性“RoundId”。
但是,如果您需要编写遍历,例如“根据谓词过滤轮次,然后遍历轮次事件”,那么您可能需要将事件作为顶点。
此外,如果您希望编写大量从事件开始的遍历,例如 g.V().has('event', ...)
或 g.E().has('event', ...)
,那么您可能希望事件是顶点,而不是边。因为我相信(对此我不是 100% 确定),在大多数图形数据库中,搜索顶点比搜索边缘更有效。