1

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

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

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

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

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

(1) 最近 1 小时内收藏的项目

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

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

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

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

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

4

1 回答 1

3

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

但是对于您的用例,您可以使用关系自动索引来索引时间戳属性,然后对其进行查询:请参阅: 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-01-31T14:07:39.903 回答