NEO4J-存储4000万个文本节点的最佳实践

时间:2018-10-08 17:19:21

标签: neo4j cypher

我已经使用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

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

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

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

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

<root>
   <eg:emph xmlns:eg="http://example.com/eg">
      <ph outputclass="AttributeName">select</ph>
      <ph outputclass="equals">=</ph>
      <ph outputclass="attributeQuotes">"</ph>
      <ph outputclass="AttributeValue">abbrev-journal-title/@abbrev-type</ph>
      <ph outputclass="attributeQuotes">"</ph>
      <abbrev-journal-title>
         <ph outputclass="italic">
            <ph outputclass="AttributeName">abbrev-type</ph>
            <ph outputclass="equals">=</ph>
            <ph outputclass="attributeQuotes">"</ph>
            <ph outputclass="AttributeValue">custom</ph>
            <ph outputclass="attributeQuotes">"</ph>
         </ph>JPhysA</abbrev-journal-title>
   </eg:emph>
   <eg:emph xmlns:eg="http://example.com/eg">
      <ph outputclass="AttributeName">select</ph>
      <ph outputclass="equals">=</ph>
      <ph outputclass="attributeQuotes">"</ph>
      <ph outputclass="AttributeValue">abbrev-journal-title/@abbrev-type</ph>
      <ph outputclass="attributeQuotes">"</ph>
      <ph outputclass="AttributeName">style</ph>
      <ph outputclass="equals">=</ph>
      <ph outputclass="attributeQuotes">"</ph>
      <ph outputclass="AttributeValue">bold</ph>
      <ph outputclass="attributeQuotes">"</ph>
      <abbrev-journal-title>
         <ph outputclass="bold">
            <ph outputclass="AttributeName">abbrev-type</ph>
            <ph outputclass="equals">=</ph>
            <ph outputclass="attributeQuotes">"</ph>
            <ph outputclass="AttributeValue">custom</ph>
            <ph outputclass="attributeQuotes">"</ph>
         </ph>JPhysA</abbrev-journal-title>
   </eg:emph>
</root>

以下是graph.db的详细信息:

47.108.544节点

45.442.034关系

13.39 GiB数据库大小

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

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

我想知道索引这样数量的节点是否做错了什么。此刻,即使文本与其他节点相同,我也会为文本中遇到的每个单词创建一个新节点。

我是否应该仅在遇到新单词时创建新节点,通过关系来管理句子结构?

在此特定情况下,您能为我提供建议或最佳做法吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

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

清理数据后,还可以为此添加一个唯一约束。