非常慢的cypher查询朋友推荐

时间:2014-04-22 20:54:32

标签: neo4j cypher

我对Neo4J和图形数据库比较陌生。我使用v2.0创建了一个新数据库,并使用400,000个人节点填充它,并且它们之间有2000万个关系。我运行下面的查询,试图找到“我关注的人跟随的人,我还没有关注的人”。查询只是非常缓慢。我认为它会闪电般快,因为这似乎是Neo的强项。

我这样做错了吗?以下是我的询问:

MATCH p=(a:person)-[:follows]->(:person)-[:follows]->(c:person)
WHERE a.id = 1000 AND NOT(a-[:follows]->c)
RETURN c.id, count(p) as count ORDER BY count DESC LIMIT 5;

如果我在获取聚合之前使用“WITH a,c,p LIMIT 10000”限制路径数(在查询中大约有40,000个),或者删除“NOT(a- [:如下] - ℃)”。不幸的是,我无法承担这些中的任何一个。

我非常感谢能得到的任何建议。

以下是我个人资料的结果:

==> ColumnFilter(symKeys=["c.personname", "  INTERNAL_AGGREGATE2a433ee6-de88-4555-969c-6057f8b44b3c"], returnItemNames=["c.personname", "cnt"], _rows=5, _db_hits=0)
==> Top(orderBy=["SortItem(Cached(  INTERNAL_AGGREGATE2a433ee6-de88-4555-969c-6057f8b44b3c of type Integer),false)"], limit="Literal(5)", _rows=5, _db_hits=0)
==>   EagerAggregation(keys=["Cached(c.personname of type Any)"], aggregates=["(  INTERNAL_AGGREGATE2a433ee6-de88-4555-969c-6057f8b44b3c,Count(a))"], _rows=16044, _db_hits=0)
==>     Extract(symKeys=["  UNNAMED49", "a", "  UNNAMED50", "c", "  UNNAMED35"], exprKeys=["c.personname"], _rows=42439, _db_hits=42439)
==>       Filter(pred="NOT(nonEmpty(PathExpression((a)-[  UNNAMED78:follows]->(c), true)))", _rows=42439, _db_hits=0)
==>         TraversalMatcher(start={"label": "person", "query": "Literal(170096)", "identifiers": ["a"], "property": "personid", "producer": "SchemaIndex"}, trail="(a)-[  UNNAMED35:follows WHERE true AND true]->(  UNNAMED49)-[  UNNAMED50:follows WHERE true AND true]->(c)", _rows=51500, _db_hits=51786)

1 个答案:

答案 0 :(得分:0)

我尽力解释执行计划有两个瓶颈,由_db_hits的高值表示。其中一个是由于(不必要地)读取所有匹配的(c)节点的属性值,然后只返回五个。您可以通过在读取属性值之前将结果限制为5来解决此问题。尝试在WITH子句中强加order和limit,然后读取并返回这五个节点的属性。像这样的东西

MATCH (a:person {id:1000})-[:follows]->()-[:follows]->(c) 
WHERE NOT a-[:follows]->c 
WITH c, count(a) as cnt  //carry (c) instead of fetching (c.id)
    ORDER BY cnt
    LIMIT 5
RETURN c.id, cnt  //fetch (c.id) only for the five nodes you are actually interested in

另一个瓶颈是查询的开始,我不知道那里出了什么问题。我在执行计划中注意到它命名属性personidpersonname,但是您发布的查询通过名为id的属性查找节点。您确定用于绑定(a)的属性是否为:person标签编制索引?您可以在浏览器中键入:schema或在shell中键入schema以列出索引,并确认列出了您在查询中使用的任何属性(personidid或其他)对于:person标签。