【问题标题】:Speed up neo4j query with many starting nodes使用许多起始节点加速 neo4j 查询
【发布时间】: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 个条目不应该是同一个节点吗?如果你寻找那个词?

标签: neo4j 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 :Category(lemma)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多