检索日期范围内发生的操作

时间:2015-01-31 13:09:01

标签: neo4j neo4jphp

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

我有一个简单的应用程序,我跟踪一个人喜欢的项目。我创建了这样的关系:

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

用户节点获得与项目的最爱关系,并将时间戳存储为关系属性。

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

(1)过去1小时内收藏的物品

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

(3)2015年1月15日的小时分割项目

我正在尝试找出返回这些结果的最佳方法。我正在使用Everyman Neo4j for PHP。

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

另外,为上面列出的三种情况构建查询的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

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

但是对于你的用例, 您可以使用relationship-auto-index索引timestamp属性,然后查询它:请参阅: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