我正在尝试开发和应用程序,需要数百万的关系。但是当试图根据创建时间(时间戳)使用cypher查询或核心java(解析所有关系)来获取最后的关系时,需要花费很多时间。
通常,用户将访问从最后一个到第一个的数据,并且可能只需要最后50个。所以我如何在加载数据时更改Neo4j的行为以便从最后的数据开始(即使是缓存中的数据),所以我不需要重新排序它们。
问候。
答案 0 :(得分:0)
您可以为每个节点提供timestamp
属性及其创建时间(可以使用Cypher timestamp()
函数获取)。
然后,您可以匹配使用此子查询创建的最后50个(可以放在实际查询之前):
MATCH (n)
ORDER BY n.timestamp DESC
LIMIT 50
WITH n
// Place your actual query here. The variable 'n' will be a collection of the last 50 nodes created.
不幸的是,这不会很快,因为neo4j将遍历每个节点以找到具有最高timestamp
值的节点。如果您只需要某些节点来设置时间戳,则应考虑向所有节点添加标签(例如,' Timestamped')并将MATCH (n)
更改为MATCH (n:Timestamped)
。
答案 1 :(得分:0)
如果您在事件节点上有时间,可以将它们放在时间树中,请参阅此处:
在Java API中,您可以将旧索引用于节点或关系,将时间戳索引为数值,然后使用lucene范围查询。
它看起来像这样:
Index<Node> timeIndex = db.index().forNodes("time");
timeIndex.add(node,"timestamp",ValueContext.indexNumeric(node.getProperty("timestamp"));
timeIndex.query(QueryContext.numericRange("timestamp",from,to));