neo4j-graph-plugin插件位址:https://github.com/crazyyanchao/neo4j-graph-plugin
NEO4J中文分詞全文索引自動更新解決方案
- 一、樣例資料
- 二、英文與中文全文索引差别
- 1、建立NEO4J預設索引
- 2、删除索引
- 3、建立支援中文分詞的索引
- 三、APOC自帶英文全文索引過程(可自動更新索引)
- 1、添加全文索引
- 2、新增節點與屬性
- 3、檢索
- 四、自定義中文分詞全文索引插件(自動更新索引不成功)
- 五、标簽交叉檢索
- 六、自定義中文分詞插件(自動更新索引失敗單獨更新節點索引)
- 2、新增節點與屬性并更新全文索引
- 3、将2新增的節點或者更新的屬性增加到索引
- 4、檢索
- 七、解決事務送出逾時
- 八、備注
使用NEO4J INDEX API實作自動更新失敗,轉換了一種思路解決這個問題(在更新節點或者建立節點的時候同步更新到對應的全文索引中。)
樣例資料格式參考
CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]})
// 以下檢索不成功:
CALL apoc.index.search('Loc', 'Loc.description:中文~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:中文*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試中文~') YIELD node RETURN node
CALL apoc.index.remove('Loc')
CALL zdr.index.addChineseFulltextIndex('Loc', ["description","cause","year"], 'Loc') YIELD message RETURN message
// 以下檢索成功:
CALL apoc.index.search('Loc', 'description:中文~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:中文*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:測試~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:測試中文~') YIELD node RETURN node
CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]},{autoUpdate:true})
CREATE (n:Loc {name:'V'}) SET n.description='測試中文分詞,複聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!',n.cause='測試英文分詞,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n
可以支援索引的自動更新,但是對于中文的檢索不友好,例如以下測試:
// 檢索失敗:
CALL apoc.index.search('Loc', 'Loc.cause:測試英文分詞~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試中文分詞~') YIELD node RETURN node
// 檢索成功:
CALL apoc.index.search('Loc', 'Loc.cause:測試英文分詞*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:測試中文分詞*') YIELD node RETURN node
addChineseFulltextAutoIndex過程為添加支援中文的全文索引過程,建立全文索引可以成功,但是對于節點的新增屬性的更新,不支援自動更新。
CALL zdr.index.addChineseFulltextAutoIndex('IKAnalyzer',["description","cause","year"],'Loc',{autoUpdate:'true'}) YIELD message RETURN message
CREATE (n:Loc {name:'V'}) SET n.description='測試中文分詞,複聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!',n.cause='測試英文分詞,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n
添加全文檢索之後就可以檢索:
CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:吖啶基氨基甲烷磺酰甲氧基苯胺', 100) YIELD node RETURN node
重新索引之後才能檢索到:
CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:測試~', 100) YIELD node RETURN node
addChineseFulltextAutoIndex/addChineseFulltextIndex支援多标簽的同時檢索,在建立索引時使用相同的索引名即可。
标簽:Loc
CALL zdr.index.addChineseFulltextAutoIndex('Loc',["description","cause","name"],'Loc',{autoUpdate:'true'}) YIELD message RETURN message
标簽:LocProvince’
CALL zdr.index.addChineseFulltextAutoIndex('Loc',["description","cause","name"],'LocProvince',{autoUpdate:'true'}) YIELD message RETURN message
檢索節點:
CALL apoc.index.search('Loc', 'name:p~') YIELD node RETURN node
為了支援單節點的索引更新,開發以下過程。(三中所描述的自動更新方案失敗,轉為在更新節點或者建立節點的時候同步更新到對應的全文索引中。)
CALL apoc.index.remove('Loc')
CALL zdr.index.addChineseFulltextIndex('Loc',["description","cause","year"],'Loc') YIELD message RETURN message
CREATE (n:Loc {name:'V'}) SET n.description='測試中文分詞,複聯終章快上映了好激動,據說知識圖譜與人工智能技術應用到了那部電影!',n.cause='測試英文分詞,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n
MATCH (n) WHERE n.name='V' WITH n CALL zdr.index.addNodeChineseFulltextIndex(n, ['description']) RETURN *
CALL zdr.index.chineseFulltextIndexSearch('Loc', 'description:測試中文~') YIELD node RETURN node
如果配置了事務送出逾時設定,在建構索引時取消。
#********************************************************************
### Neo4j transcation timeout
###******************************************************************
#dbms.transaction.timeout=180s
使用背景腳本執行建構索引程式:
# index.sh
#!/usr/bin/env bash
nohup /neo4j-community-3.4.9/bin/neo4j-shell -file build.cql >>indexGraph.log 2>&1 &
// build.cql
CALL zdr.index.addChineseFulltextIndex('IKAnalyzer', ['description','fullname','name','lnkurl'], 'LinkedinID') YIELD message RETURN message;
如果使用APOC自帶的過程,設定自動更新配置之後即可,但是會影響性能。
apoc.autoIndex.enabled=true
// 建構示例
CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]},{autoUpdate:true})
上述所有涉及到的NEO4J自定義過程參考
原文位址:https://blog.csdn.net/superman_xxx/article/details/89486277 </div>