将LIMIT
与ORDER BY
一起使用时,具有所选标签的每个节点仍会被扫描(即使使用索引)。
例如,假设我有以下内容:
MERGE (:Test {name:'b'})
MERGE (:Test {name:'c'})
MERGE (:Test {name:'a'})
MERGE (:Test {name:'d'})
运行以下操作会获得:Test {name: 'a'}
,但是使用PROFILE
我们可以看到整个列表都会被扫描,显然无法很好地扩展。
MATCH (n:Node)
RETURN n
ORDER BY n.name
LIMIT 1
我有一些可用于此标签的排序选项。这些排序中的节点顺序不应经常更改,但是,我无法缓存这些列表,因为每个列表都是为用户个性化的,即用户可能隐藏了:Test {name:'b'}
这样的事情是否有黄金法则?是否可以在此处为每个排序选项创建从节点到节点的指针?像
这样的东西 (n {name:'a'})-[:ABC_NEXT]->(n {name:'b'})-[:ABC_NEXT]->(n {name:'c'})-...
我可以拥有多个排序指针吗?那会有点矫枉过正吗?
价:
答案 0 :(得分:0)
这是我最终为感兴趣的人做的事情:
// connect nodes
MATCH (n:Test)
WITH n
ORDER BY n.name
WITH COLLECT(n) AS nodes
FOREACH(i in RANGE(0, length(nodes)-2) |
FOREACH(node1 in [nodes[i]] |
FOREACH(node2 in [nodes[i+1]] |
CREATE UNIQUE (node1)-[:IN_ORDER_NAME]->(node2))))
// create list, point first item to list
CREATE (l:List { name: 'name' })
WITH l
MATCH (n:Test) WHERE NOT (m)<-[:IN_ORDER_NAME]-()
MERGE (l)-[:IN_ORDER_NAME]->(n)
// getting 10 nodes sorted alphabetically
MATCH (:List { name: 'name' })-[:IN_ORDER_NAME*]->(n)
RETURN n
LIMIT 10