索引neo4j边缘的最佳实践

时间:2016-05-20 12:29:25

标签: indexing neo4j

考虑一下我有一个图表模型,用户可以在这里看到项目,并且实际喜欢的时间记录在边缘:

(:USER {name:Bill})-[:ACTION {type:like, time:1234567890}]->(:ITEM {name:Porsche})

现在我要选择所有:特定的动作:按时间排序的用户'非常快。我不需要:所有操作:USERs排序,仅针对特定的:USER。可以想到的简单解决方案是索引,其中每个:USER,有一个索引:ACTION by' time'领域。问题在于neo4j似乎不允许进行这种高级索引操作。

我可以想到neo4j支持的解决方法

Model - (:USER {id:54321,name:Bill})-[:DOES]->(:ACTION:USER_54321_ACTION {type:like, time:1234567890})-[:REFERS_TO]->(:ITEM {name:Porsche})
Index - CREATE INDEX ON :USER_54321_ACTION(time)

但我不喜欢这种方法,特别是因为它使用生成的标签和2个冗余元素。

使用neo4j是否有更好的解决方案?

ps:如果你熟悉DynamoDB,那么我从neo4j那里寻求的就是' hash'和'范围'索引概念,其中'范围'为每个特定的哈希'创建索引。键,而不是表格中的所有项目。

2 个答案:

答案 0 :(得分:2)

选项1)来自@ stdob--指向正确的方向。不过我的情况有点不同:

  • 关注stdob--我们有"行动"具有time属性的节点将用户与项目连接起来。但是这个动作没有标签,也没有索引。基本原理:索引始终在每个标签级别上。因此,查询所有操作以查找特定于给定用户的少数操作效率不高。
  • 使用PREV关系
  • 另外将两个后续操作节点相互连接
  • 最近的操作使用LAST_ACTION关系连接到用户。因此,您有一个按时间预先排序的所有操作节点的链接列表。入口点是LAST_ACTION关系(当添加新操作时,当然需要移动它)

答案 1 :(得分:0)

1)我认为模型的变化是正确的解决方案。但是我的版本有点改变了:

Model - (:USER {id:54321,name:Bill})
          -[:DOES]->
        (:ACTION:ACTION_LIKE {time:1234567890})
          -[:REFERS_TO]->
        (:ITEM {name:Porsche})
Index - CREATE INDEX ON :ACTION(time)
        CREATE INDEX ON :ACTION_LIKE(time)

2)如果没有,请查看遗留索引的方向。

3)或者,使用APOC代替Neo4j。