2014-02-10 51 views
0

继我以前的问题: cypher 2.0 : using label based index to search a set of nodes暗号2.0:优化查询

我试图优化查询找到用户的公共组:

MATCH (gr:Group) <--(us:User)-->(gr2:Group) 
WHERE gr.name = "gr1" or gr.name = "gr2" 
return distinct gr2 as prop, count(distinct us) as users 
limit 10 

不幸的是,它需要大约4-5秒。 跑查询 '个人资料',并得到以下结果:

ColumnFilter(symKeys=["prop", " INTERNAL_AGGREGATE074636fa-2950-4845-93ae-9d87da36e2b5"], returnItemNames=["prop", "users"], _rows=10, _db_hits=0) 
Slice(limit="Literal(10)", _rows=10, _db_hits=0) 
    EagerAggregation(keys=["Cached(prop of type Node)"], aggregates=["( INTERNAL_AGGREGATE074636fa-2950-4845-93ae-9d87da36e2b5,Distinct(Count(us),us))"], _rows=10, _db_hits=0) 
    Extract(symKeys=["us", " UNNAMED20", "gr", "gr2", "r"], exprKeys=["prop"], _rows=34060, _db_hits=0) 
     Filter(pred="((Property(pr,name(1)) == Literal(gr1) OR Property(pr,name(1)) == Literal(gr2)) AND hasLabel(gr:Group(2)))", _rows=34060, _db_hits=68120) 
     SimplePatternMatcher(g="(us)-[' UNNAMED20']-(gr)", _rows=34060, _db_hits=1653118) 
      Filter(pred="hasLabel(gr2:Group(2))", _rows=28188, _db_hits=0) 
      TraversalMatcher(start={"label": "User", "producer": "NodeByLabel", "identifiers": ["us"]}, trail="(us)-[r WHERE hasLabel(NodeIdentifier():Group(2)) AND true]-(gr2)", _rows=28188, _db_hits=48828) 

起床1653118个db_hits

但是下面的查询只需要200毫秒:

MATCH (gr:Group) <--(us:User)-->(gr2:Group) 
WHERE gr.name = "gr1" or gr.name = "gr2" 
return distinct gr2 as prop 
limit 10 

而且,它的轮廓:

Slice(limit="Literal(10)", _rows=10, _db_hits=0) 
Distinct(_rows=10, _db_hits=0) 
    Extract(symKeys=["us", " UNNAMED20", "gr", "gr2", "r"], exprKeys=["prop"], _rows=17, _db_hits=0) 
    Filter(pred="((Property(gr,name(1)) == Literal(gr1) OR Property(gr,name(1)) == Literal(gr2)) AND hasLabel(gr:Group(2)))", _rows=17, _db_hits=34) 
     SimplePatternMatcher(g="(us)-[' UNNAMED20']-(gr)", _rows=17, _db_hits=600) 
     Filter(pred="hasLabel(gr2:Group(2))", _rows=10, _db_hits=0) 
      TraversalMatcher(start={"label": "User", "producer": "NodeByLabel", "identifiers": ["us"]}, trail="(us)-[r WHERE hasLabel(NodeIdentifier():Group(2)) AND true]-(gr2)", _rows=10, _db_hits=18) 

最多只能获得600 db_hits顶部

是否有任何方法可以更改第一个查询以获得相同的结果以获得更好的性能? 我只是不能接受每查询性能4秒....

回答

4

MATCH (gr:Group) 
WHERE gr.name = "gr1" or gr.name = "gr2" 
WITH gr 
MATCH (gr)<--(us:User)-->(gr2:Group) 
return distinct gr2 as prop, count(distinct us) as users 
limit 10 

更好吗?

+0

是的!像魅力一样工作。它就像使用1.9“START”一样,它使得新的密码2.0看起来有点不称​​职...... – skme

+0

哦,太好了:-)相同的概念 - 匹配整个模式的路径数grgr2是非常大,如您的个人资料所示。只是把它分开,以限制你想过滤的gr。 – Luanne