2

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

该数据库由许多孤立的图(代表句子)组成,每个图都是一个节点链,类似于NODE1-[:NEXT]->NODE2-[:NEXT]->NODE3,每个节点是一些具有属性的单词。对 db 的大多数查询都是这样的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,因为我觉得它优雅且富有表现力,如果问题出在其他地方那就太好了:)

4

1 回答 1

0

既然你在 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 :Category(lemma)

于 2013-11-02T08:01:22.737 回答