2016-06-22 3 views
0

LIMITORDER BYと使用すると、選択したラベルのすべてのノードがスキャンされます(インデックスを含む場合もあります)。すべてのノードをスキャンしないオーダーリスト

たとえば、のは、私は、次があるとしましょう:

MERGE (:Test {name:'b'}) 
MERGE (:Test {name:'c'}) 
MERGE (:Test {name:'a'}) 
MERGE (:Test {name:'d'}) 

次のことを実行しているが、我々は明らかにうまくスケールしませんこれは、スキャンしますリスト全体を見ることができPROFILEを使用して、私たち:Test {name: 'a'}取得します。

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/

答えて

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 
関連する問題