【发布时间】:2013-10-31 21:26:38
【问题描述】:
我正在为用自然语言编写的带有句法注释的句子构建一个数据库。数据库结构非常具体,所以我想知道是否可以使用 neo4j 来完成该任务。
数据库由许多孤立的图(代表句子)组成,每个图是一个节点链,类似于NODE1-[:NEXT]->NODE2-[:NEXT]->NODE3,每个节点都是一些具有属性的词。对数据库的大多数查询类似于START x=node:nodes(lemma="buy") MATCH x-[:NEXT]->y-[:NEXT]->z RETURN x,y,z,所以基本上目的只是提取 ngram。我使用基于词引理的简单索引。
数据库中有 6500 万个节点、2.7 亿个属性和 1.1 亿个关系。
我正在使用 neo4j 2.0.0 M-06。
问题在于 neo4j 执行此类 ngram 查询需要花费太多时间。例如,上面的查询需要 140 多秒。它似乎取决于在索引中找到的起始节点的数量。如果数字很大(~50k),则查询滞后。
我尝试通过 webadmin 使用 cypher、通过 java 和遍历框架使用 cypher 进行查询,看起来从索引中检索项目存在一些问题,就像它在我迭代它们时以某种方式收集项目一样。在 cypher-java 中,当我执行查询时,它需要 500 毫秒,但是当我调用迭代器时,它需要上面提到的 140 多秒。
谁能告诉我是否有类似的事情,或其他任何可能导致此类问题的事情?也许有一种有效的方法来处理这种多起始节点但简单匹配条件的查询?
如果可能的话,我想坚持使用 Cypher,因为我觉得它优雅且富有表现力,如果问题出在其他地方那就太好了:)
【问题讨论】:
-
只做
START x=node:nodes(lemma="buy") return count(*)需要多长时间。你用多少内存来运行你的 Neo4j 服务器?您的查询返回多少行? -
这 50k 个条目不应该是同一个节点吗?如果你寻找那个词?