【问题标题】:NEO4J - Best practices to store 40 millions of text nodesNEO4J - 存储 4000 万个文本节点的最佳实践
【发布时间】:2018-10-08 17:19:21
【问题描述】:

我已经使用 Neo4j 几个星期了,我认为它很棒。

我正在构建一个 NLP 应用程序,基本上,我使用 Neo4j 来存储语义解析器生成的依赖图,如下所示:

https://explosion.ai/demos/displacy?text=Hi%20dear%2C%20what%20is%20your%20name%3F&model=en_core_web_sm&cpu=1&cph=0

在节点中,我存储句子中包含的单个单词,并通过与许多不同类型的关系将它们连接起来。

对于我的应用程序,我需要查找包含给定单词的所有节点,所以基本上我必须搜索所有节点,找到包含输入单词的节点。当然,我已经在 word 文本字段上创建了索引。

我正在处理一个非常大的数据集:

在我的笔记本电脑上,以下查询大约需要 20 毫秒:

 MATCH (t:token) WHERE t.text="avoid" RETURN t.text

这里是graph.db的详细信息:

47.108.544 个节点

45.442.034 个关系

13.39 GiB 数据库大小

在 token.text 字段上创建的索引

PROFILE MATCH (t:token) WHERE t.text="switch" RETURN t.text

------------------------
NodeIndexSeek
251,679 db hits
---------------
Projection
251,678 db hits
--------------
ProduceResults
251,678 db hits 
---------------

我想知道我在索引这么多节点时是否做错了什么。目前,我为文本中遇到的每个单词创建一个新节点,即使文本与其他节点相同。

是否应该只在遇到新单词时才创建一个新节点,通过关系管理句子结构?

您能帮我提出一个建议或最佳做法,以便在这个特定案例中采用吗?

非常感谢

【问题讨论】:

标签: neo4j cypher


【解决方案1】:

对于这个用例,您的每个 :Token 节点都应该是唯一的。当您创建这些时,您应该对节点本身使用 MERGE 而不是 CREATE,因此如果节点已经存在,它将使用现有节点而不是创建新节点。

在您清理完数据后,为此添加一个唯一约束可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2013-11-24
    • 2014-01-13
    • 2011-05-21
    • 2015-09-21
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多