2014-06-14 41 views
0

我在Neo4J中有以下Cypher查询,它可以获取图中的所有节点以及JSON文件的连接,然后使用Sigma.Js库显示图。如何让Neo4J Cypher查询更快执行?

MATCH (c1:Concept), (c2:Concept), (ctx:Context), c1-[rel:TO]->c2 
WHERE (rel.user='9d6e7140-f3c3-11e3-927f-1f5ca4210ac7' 
AND ctx.uid = rel.context) 
WITH DISTINCT c1, c2 
MATCH (ctxname:Context), c1-[relall:TO]->c2 
WHERE (relall.user='9d6e7140-f3c3-11e3-927f-1f5ca4210ac7' 
AND ctxname.uid = relall.context) 
RETURN DISTINCT 
c1.uid AS source_id, 
c1.name AS source_name, 
c2.uid AS target_id, 
c2.name AS target_name, 
relall.uid AS edge_id, 
ctxname.name AS context_name, 
relall.statement AS statement_id, 
relall.weight AS weight; 

这个特定的查询返回89行数据。

奇怪的是,当c1c2节点的数量和rel关系很小时,它工作得相对较快。然而,随着这些节点的数量和它们之间的关系增加,查询速度变得非常慢,可能是因为Neo4J必须通过很多关系重申。

如果我需要它以相同的格式返回数据并且它应该全部在一个查询中完成,您是否知道如何更快地创建此查询?

这里的个人资料信息:

Distinct(_rows=89, _db_hits=0) 
Extract(symKeys=["c1", "c2", "ctxname", "relall"], exprKeys=["source_name", 
"statement_id", "edge_id", "target_id", "source_id", "target_name", "context_name", 
"weight"], _rows=89, _db_hits=712) 

Filter(pred="(Property(relall,user(8)) == Literal(9d6e7140-f3c3-11e3-927f-1f5ca4210ac7) 
AND Property(ctxname,uid(1)) == Property(relall,context(7)))", _rows=89, _db_hits=267) 
SimplePatternMatcher(g="(c1)-['relall']-(c2)", _rows=89, _db_hits=2166150) 
NodeByLabel(identifier="ctxname", _db_hits=0, _rows=44100, label="Context", 
identifiers=["ctxname"], producer="NodeByLabel") 

Distinct(_rows=84, _db_hits=0) 
Filter(pred="Property(ctx,uid(1)) == Property(rel,context(7))", _rows=89, _db_hits=93450) 
     NodeByLabel(identifier="ctx", _db_hits=0, _rows=46725, label="Context", 
identifiers=["ctx"], producer="NodeByLabel") 
      Filter(pred="hasLabel(c2:Concept(1))", _rows=89, _db_hits=0) 
      TraversalMatcher(start={"label": "Concept", "producer": "NodeByLabel",  
"identifiers": ["c1"]}, trail="(c1)-[rel:TO WHERE hasLabel(NodeIdentifier():Concept(1)) 
AND Property(RelationshipIdentifier(),user(8)) == Literal(9d6e7140-f3c3-11e3-927f- 
1f5ca4210ac7)]->(c2)", _rows=89, _db_hits=127572) 

感谢您的帮助,您可以提供,或者至少,如果你能告诉我这个查询的薄弱点是从个人资料信息判断之上...

回答

0

你relatioship是一个“超边”,应该是一个节点,你知道这一点从过去的讨论:)

当你没有一个索引查找的起点此查询必须扫描全图。

为字段用户启用关系自动索引并使用关系查找来启动此查询。

此外,您的上下文匹配它找到的每个关系,不知道您是否期望多个上下文匹配?

还要确保有一个索引:上下文(UID)

START rel = relationship:relationship_auto_index(user='9d6e7140-f3c3-11e3-927f-1f5ca4210ac7') 
WHERE type(rel) = "TO" 
WITH rel, startNode(rel) as c1, endNode(rel) as c2 
WHERE (c1:Concept) AND (c2:Concept) 
MATCH (ctx:Context) 
WHERE ctx.uid = rel.context 
WITH DISTINCT c1, c2 
MATCH c1-[relall:TO]->c2 
WHERE (relall.user='9d6e7140-f3c3-11e3-927f-1f5ca4210ac7') 
MATCH (ctxname:Context) 
WHERE ctxname.uid = relall.context 
RETURN DISTINCT 
c1.uid AS source_id, 
c1.name AS source_name, 
c2.uid AS target_id, 
c2.name AS target_name, 
relall.uid AS edge_id, 
ctxname.name AS context_name, 
relall.statement AS statement_id, 
relall.weight AS weight;