【问题标题】:Neo4j Structure for GPS coordinates logGPS坐标日志的Neo4j结构
【发布时间】:2013-10-30 13:46:21
【问题描述】:

我将 neo4j 用于社交网络,我们称之为社交网络,用户可以在其中记录他们在锻炼期间的位置(想想 Runkeeper 和 Strava)。

我正在考虑如何保存坐标。 像node(user)-has->node(workouts)<-is a-node(workout)-start->node(coord)-next->node(coord)-next->.... 这样使用它是否是个好主意,即每次锻炼都有坐标的链接列表?

我永远不会在数据库中查询单个点,锻炼将始终作为一个整体进行检索。

这是解决这个问题的更好方法吗?

我可以想象图形数据库不是存储此类数据的理想数据库,但我不想现在增加添加另一个数据库的复杂性。

有人可以给我任何关于这方面的见解吗?

【问题讨论】:

  • 看看其他 neo4j 问题的答案,也许@PeterNeubauer 可以提供一些见解?

标签: neo4j graph-databases


【解决方案1】:

我建议您将其存储为:

user --has--> workout --positionedAt--> coord

这种设计对我来说感觉更自然,因为您在问题中提到的链表设计只会产生非常深的遍历,这可能会让查询很烦人。通过这种方式,您可以通过简单地迭代workout 顶点上的边轻松找到特定锻炼的所有坐标。我建议在 positionedAt 边缘存储一个日期时间戳,以便您可以轻松地对坐标进行排序。

不利的一面是,根据您打算拥有多少个coord 顶点,您最终可能会得到一些肥大的workout 顶点,但这可能不会真正影响您的用例。我想不出会产生 100000 个坐标(因此产生 100000 个边)之类的锻炼,但也许你可以。如果是这样,我想我可以稍微修改一下答案。

【讨论】:

  • 感谢您的回答@stephen!想象一下每 5 秒取一次坐标,这场比赛runkeeper.com/user/oskarhane/activity/153751368 将有 ≈ 20000 分。你通过positionedAt 将每个coord 直接连接到workout,我是否正确?每个新的workout 直接通过has 给用户?如果每个用户都有类似 1000 个workouts 会不会有问题,还是仍然很快?
  • 这取决于您对“快速”的定义以及您打算如何查询它的上下文。如果您需要找到平均锻炼时间,通过从user 遍历到每个workout 以从coord 顶点获取开始/结束时间,这是一个痛苦的遍历。在这种情况下,将开始/结束/经过的时间存储在workout 本身上可能是明智的。对于图表,性能在很大程度上取决于您必须触摸多少图表才能完成您想做的事情。
  • 在选择最适合您的用例之前,您还应该了解各种图形数据库的优缺点。结帐tinkerpop.com 以在做出选择之前尝试许多不同的图表(包括 Neo4j)。
猜你喜欢
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2016-09-03
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
相关资源
最近更新 更多