订单列表不扫描每个节点

时间:2016-06-22 21:33:37

标签: neo4j cypher

LIMITORDER 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'})-...

我可以拥有多个排序指针吗?那会有点矫枉过正吗?

价:

  1. https://neo4j.com/blog/moving-relationships-neo4j/
  2. http://www.markhneedham.com/blog/2014/04/19/neo4j-cypher-creating-relationships-between-a-collection-of-nodes-invalid-input/

1 个答案:

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