Neo4j核心:通过订单加载RelationShips

时间:2014-05-15 12:51:42

标签: java neo4j spring-data-neo4j

我正在尝试开发和应用程序,需要数百万的关系。但是当试图根据创建时间(时间戳)使用cypher查询或核心java(解析所有关系)来获取最后的关系时,需要花费很多时间。

通常,用户将访问从最后一个到第一个的数据,并且可能只需要最后50个。所以我如何在加载数据时更改Neo4j的行为以便从最后的数据开始(即使是缓存中的数据),所以我不需要重新排序它们。

问候。

2 个答案:

答案 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));

请参阅QueryContext API