提问者:小点点

使用许多起始节点加速neo4j查询


我正在为用自然语言编写的语法注释句子构建一个数据库。数据库结构非常具体,所以我想知道我是否可以使用neo4j来完成这项任务。

数据库由许多孤立的图(表示句子)组成,每个图都是节点链,类似于NODE1-[: NEXT]-

数据库中有6500万节点、2.70亿属性和1.10亿关系。

我正在使用neo4j 2.0.0 M-06。

问题是neo4j执行这样的ngram查询需要太多时间。例如,上面的查询需要140秒。它似乎取决于在索引中找到的起始节点的数量。如果数量很大(~50k),查询就会滞后。

我尝试过通过webadmin使用cypher进行查询,通过cypherjava和遍历框架进行查询,看起来从index中检索项目有一些问题,就像它在我遍历它们时以某种方式收集项目一样。在密码中java当我执行查询时需要500毫秒,但是当我调用迭代器时,需要上面提到的140秒。

有人能告诉我是否有类似的事情,或者其他任何可能导致这样一个问题的事情吗?也许有一种有效的方法来处理这么多起始节点但简单匹配条件的查询?

如果可能的话,我想坚持使用Cypher,因为我觉得它优雅而富有表现力,如果问题出在其他地方,那就太好了:)


共1个答案

匿名用户

既然你在2.0.0-M06上,在这里使用标签怎么样?

不知道有关您的图模型的详细信息,但您可以尝试使用引理的值作为标签。在这种情况下,您的查询将如下所示:

MATCH (x:buy)-[:NEXT]->y-[:NEXT]->z RETURN x,y,z

另一个想法是为lemma=Buy设置一个类别节点。所有引用此节点的节点都与类别节点有关系。为了将类别节点与其他节点区分开来,您也可以使用标签。在这种情况下,索引查找将只返回类别节点,您基本上将使用图内索引:

MATCH (c:Category)<-[:HAS_CATEGORY]-(x)-[:NEXT]->y-[:NEXT]->z 
WHERE c.lemma = 'buy'
RETURN x,y,z

(这里你应该使用模式索引CREATE INDEX ON:类别(引理)