2015-04-04 26 views
0

NODESNeo4j的傳統關係自動索引慢速在暗號查詢

1000000 x ({prop:'a'}) 
1000000 x ({prop:'b'}) 
1000000 x ({prop:'c'}) 

NODE SET =〜3MegaNodes

觀察值:prop不是排他性屬性附加傷害。


關係

1000 x [:TYPEA {date:20150301} ] 
1000 x [:TYPEA {date:20150228} ] 
1000 x [:TYPEA {date:20150227} ] 
1000 x [:TYPEA {date:........} ] 
1000 x [:TYPEA {date:19000101} ] 

1000 x [:TYPEB {date:20150301} ] 
1000 x [:TYPEB {date:20150228} ] 
1000 x [:TYPEB {date:20150227} ] 
1000 x [:TYPEB {date:........} ] 
1000 x [:TYPEB {date:19000101} ] 

TYPEA =42062天X 1個000 RELS

TYPEA =〜42 000 000

TYPEB =〜42 000 000

關係集 =〜84個MegaRels


我想匹配的模式:

MATCH (n1 {prop:'a'}) -[ r1:TYPEA {date:200} ]-> (n2 {prop:'b'}) 
RETURN n2; 

通過索引提高

我neo4j.properties:

relationship_auto_indexing=true 
relationship_keys_indexable=date 

Cypher支架查詢:

START 
    r1 = relationship:relationship_auto_index('date:200') 
MATCH (n1 {prop:'a'}) -[r1:TYPEA]-> (n2 {prop:'b'}) 
RETURN n2; 

:)工作正常!


現在,我想匹配的模式:

MATCH 
    (n1 {prop:'a'}) 
    -[ r1:TYPEA {date:200} ]-> 
    (n2 {prop:'b'}) 
    -[ r2:TYPEA {date:200} ]-> 
    (n3 {prop:'c'}) 
RETURN n2, n3; 

然後我嘗試:

START 
    r1 = relationship:relationship_auto_index('date:200'), 
    r2 = relationship:relationship_auto_index('date:200') 
MATCH (n1 {prop:'a'}) -[r1:TYPEA]-> (n2 {prop:'b'}) -[r2:TYPEA]-> (n3 {prop:'c'}) 
RETURN DISTINCT n2, n3; 

:(運行慢


因爲發生笛卡爾乘積產許多中間結果。1000^2.

一方面,不可能在查詢中多次使用相同的標識符。

另一方面,標籤索引(架構)不適用於關係。

有希望嗎? (版本:Neo4j-community-2.2.0)

當在查詢密碼中不使用子句開始時,關係舊式索引有什麼優點?

感謝名單

回答

1

此修改概念性的查詢,但工作得很好:

START 
    r = relationship:relationship_auto_index('date:200') 
WITH [x IN COLLECT(r) WHERE TYPE(x)='TYPEA'] AS cr 
UNWIND cr AS r1 
    MATCH (n1 {prop:'a'}) -[r1]-> (n2 {prop:'b'}) 
WITH DISTINCT n2, cr 
UNWIND cr AS r2 
    MATCH (n2) -[r2]-> (n3 {prop:'c'}) 
RETURN DISTINCT n2, n3; 

THX