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

使用多个起始节点加速neo4j查询,neo4j,cypher,Neo4j,Cypher,我正在为用自然语言编写的带语法注释的句子建立数据库。数据库结构非常具体,所以我想知道是否可以使用neo4j来完成该任务 数据库由许多独立的图(表示句子)组成,每个图是一个节点链,类似于NODE1-[:NEXT]>NODE2-[:NEXT]>NODE3,每个节点都是具有属性的单词。对db的大多数查询类似于START x=node:nodes(lemma=“buy”)匹配x-[:NEXT]>y-[:NEXT]>z返回x,y,z,因此基本上目的只是提取NGRAM。我使用一个基于单词引理的简单索引 数据

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

数据库由许多独立的图(表示句子)组成,每个图是一个节点链,类似于
NODE1-[:NEXT]>NODE2-[:NEXT]>NODE3
,每个节点都是具有属性的单词。对db的大多数查询类似于
START x=node:nodes(lemma=“buy”)匹配x-[:NEXT]>y-[:NEXT]>z返回x,y,z
,因此基本上目的只是提取NGRAM。我使用一个基于单词引理的简单索引

数据库中有6500万个节点、2.7亿个属性和1.1亿个关系

我使用的是neo4j 2.0.0 m-06

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

我曾经尝试过通过webadmin使用cypher进行查询,通过java和traversal框架使用cypher进行查询,从索引中检索项目时似乎出现了一些问题,比如在我遍历项目时,它以某种方式收集了项目。在cypher java中,当我执行查询时需要500毫秒,但是当我调用迭代器时,需要140秒以上的时间

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


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

既然您使用的是2.0.0-M06,那么在这里使用标签怎么样

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

MATCH (x:buy)-[:NEXT]->y-[:NEXT]->z RETURN x,y,z
另一个想法是为
lemma=buy
设置一个category节点。所有引用此的节点都与类别节点有关系。要将类别节点与其他节点区分开来,还可以使用标签。在这种情况下,索引查找将只返回类别节点,您基本上将在图形索引中使用:

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

(这里您应该使用一个模式索引
在:Category(lemma)上创建索引

当您只执行
开始x=node:nodes(lemma=“buy”)返回计数(*)时需要多长时间)
。运行Neo4j服务器需要多少内存?查询返回多少行?这些50k条目的节点不应该是同一个节点吗?如果查找单个单词?