【问题标题】:Retrieve actions that happened in a date range检索在某个日期范围内发生的操作
【发布时间】:2023-04-08 21:13:02
【问题描述】:

我已经为此搜索了一个答案,但没有得到确切的解决方案。

我有一个简单的应用程序,我可以在其中跟踪一个人最喜欢的项目。我创建这样的关系:

         [:favorite]
(user) ---------------------> (item)
         timestamp:xxxxxx

用户节点获取到该项目的收藏关系,我将时间戳存储为关系属性。

可以有多个用户收藏同一个项目,一个用户也可以收藏多个项目。现在,我的用例是查找在特定日期范围内收藏的项目,例如:

(1) 过去 1 小时内收藏的项目

(2) 2015 年 1 月 1 日至 2015 年 1 月 15 日期间收藏的项目

(3) 2015 年 1 月 15 日收藏的项目按小时划分

我正在尝试找出返回这些结果的最优化方式。我正在为 PHP 使用 Everyman Neo4j。

我的问题是如何索引时间戳属性(我相信这会大大提高性能)?

另外,对于上面列出的三个场景,构建查询的最佳方式是什么?

【问题讨论】:

    标签: neo4j neo4jphp


    【解决方案1】:

    通常您会将时间建模为图中的一种树或链表结构。

    但是对于您的用例, 您可以使用关系自动索引来索引时间戳属性,然后对其进行查询:请参阅:http://neo4j.com/docs/stable/rest-api-configurable-auto-indexes.html

    我认为选择一种易于搜索和排序的格式是有意义的,例如yyyy-mm-dd-hh

    将您的 conf/neo4j.properties 更改为:

    relationship_auto_indexing=true
    relationship_keys_indexable=timestamp
    

    但您必须重新索引现有数据,

    开始 rel=relationship()

    你可以查询它:

    start rel = relationship:relationship_auto_index("timestamp:2015-01-*")
    match (user)-[rel]->(item)
    ....
    

    start rel = relationship:relationship_auto_index("timestamp:2015-01-*")
    return startNode(rel) as user, endNode(rel) as item
    

    范围不能使用数值,但可以使用字符串。

    start rel = relationship:relationship_auto_index("timestamp:[2015-01-01-00 TO 2015-02-01-00]")
    return startNode(rel) as user, endNode(rel) as item
    

    【讨论】:

    • 非常感谢。你能否提出一个解决方案来解决我如何返回一个小时明智的收藏夹?也就是说,比如说 2015 年 1 月 15 日,我想查找当天每小时收到的特定项目 A 的收藏数量,即在 00:00 和 01:00、01:00 和 02:00 之间。 .. 23:00 和 00:00。运行查询 24 次看起来并不漂亮。
    • 如果我有另一个具有时间戳属性的关系(称为“cities_visited”),那么自动索引将如何区分 city_visited 和收藏关系的时间戳?换句话说,我应该使用不同的属性名称来存储不同类型关系的时间戳值吗?当我们向关系索引添加更多属性时,是否有任何性能注意事项需要牢记?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多