我已经使用Neo4j几周了,我认为它很棒。
我正在构建一个NLP应用程序,基本上,我正在使用Neo4j来存储由语义解析器生成的依赖关系图,如下所示:
在节点中,我存储了句子中包含的单个单词,并通过与多种不同类型的关系将它们连接起来。
对于我的应用程序,我需要查找包含给定单词的所有节点,因此基本上我必须搜索所有节点,找到包含输入单词的那些节点。当然,我已经在单词文本字段上创建了索引。
我正在处理一个非常大的数据集:
在我的笔记本电脑上,以下查询大约需要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
我想知道索引这样数量的节点是否做错了什么。此刻,即使文本与其他节点相同,我也会为文本中遇到的每个单词创建一个新节点。
我是否应该仅在遇到新单词时创建新节点,通过关系来管理句子结构?
在此特定情况下,您能为我提供建议或最佳做法吗?
非常感谢
答案 0 :(得分:0)
在这种情况下,每个:Token节点都应该是唯一的。创建这些节点时,应该对节点本身使用MERGE而不是CREATE,因此,如果该节点已存在,它将使用现有的节点而不是创建新的节点。
清理数据后,还可以为此添加一个唯一约束。