【发布时间】:2018-10-08 17:19:21
【问题描述】:
我已经使用 Neo4j 几个星期了,我认为它很棒。
我正在构建一个 NLP 应用程序,基本上,我使用 Neo4j 来存储语义解析器生成的依赖图,如下所示:
在节点中,我存储句子中包含的单个单词,并通过与许多不同类型的关系将它们连接起来。
对于我的应用程序,我需要查找包含给定单词的所有节点,所以基本上我必须搜索所有节点,找到包含输入单词的节点。当然,我已经在 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
---------------
我想知道我在索引这么多节点时是否做错了什么。目前,我为文本中遇到的每个单词创建一个新节点,即使文本与其他节点相同。
是否应该只在遇到新单词时才创建一个新节点,通过关系管理句子结构?
您能帮我提出一个建议或最佳做法,以便在这个特定案例中采用吗?
非常感谢
【问题讨论】: