我正在为用自然语言编写的语法注释句子构建一个数据库。数据库结构非常具体,所以我想知道我是否可以使用neo4j完成该任务。
数据库由许多孤立的图形(表示句子)组成,每个图形都是一个节点链,类似于NODE1-[:NEXT]->NODE2-[:NEXT]->NODE3
,每个节点都是带有属性的单词。对db的大多数查询都是START x=node:nodes(lemma="buy") MATCH x-[:NEXT]->y-[:NEXT]->z RETURN x,y,z
,所以基本上目的只是提取ngrams。我使用一个基于单词lemmas的简单索引。
数据库中有6500万个节点,2.7亿个属性和1.1亿个关系。
我正在使用neo4j 2.0.0 M-06。
问题是neo4j花了太多时间来执行这样的ngram查询。例如,上面的查询需要140多秒。它似乎取决于索引中找到的起始节点的数量。如果数字很大(约50k),则查询滞后。
我尝试通过webadmin查询cypher,通过java和遍历框架查询密码,看起来从索引中检索项目有一些问题,就像我在迭代它们时以某种方式收集项目。在cypher-java中,当我执行查询时需要500ms,但是当我调用迭代器时,它需要上面提到的140+秒。
有人能告诉我是否有类似的东西或其他可能导致此类问题的事情?也许有一种有效的方法来处理这么多起始节点但简单匹配条件的查询?
如果可能的话,我想坚持使用Cypher,因为我发现它优雅而富有表现力,如果问题出现在其他地方会很棒:)
答案 0 :(得分: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)