如何正确管理neo4j-community-3.1.0 lucene遗留索引? (非常奇怪的问题)

时间:2017-03-31 18:30:09

标签: python indexing neo4j lucene

我在Neo4j的遗留索引方面遇到了奇怪的问题,并且今天陷入困境。我需要全文支持,因为我希望对Solr(使用Lucene全文)进行性能比较,以查看不同数据模型的比较。

我一直在网上关注一些指南,以及这里的各种帖子。

直到昨天我才取得成功,突然之间我的索引文件已经损坏,因为范围查询返回了无效且不一致的结果。因此,我正在努力确定我需要采取的步骤。

我使用CSV批量导入工具在我的数据库中填充了大约400万个节点,标签为"记录",各种节点标有"数据:SPD",&# 34;数据:DIR","数据:TS"等(使用2个标签,表示它们是海洋数据节点,用于不同类型的测量)。

数据模型很简单。我有:

(r:record {meta:M, time:T, lat:L1, lon:L2})-[:measures]-(d:data {value:V})

M是一个类似ID的字符串,我用它来内部跟踪我的数据以进行测试。 T是一个纪元时间整数。 L1 / L2是地理空间坐标浮点数。我的data节点表示各种收集的数据,并非所有记录都具有相同的数据节点。 (有些人有温度,风速,风向,海水温度等)。这些值都表示为浮点数。每个数据节点都有第二个标签,说明它包含哪种数据。

完成导入后,打开shell并执行以下序列:

index --create node_auto_index -t Node
index --set-config node_auto_index fulltext

我将以下配置添加到默认的neo4j.conf文件中(甚至在CSV批量导入发生之前就已存在):

dbms.auto_index.nodes.enabled=true
dbms.auto_index.nodes.keys=meta,lat,lon,time

在今天之前,我会通过查询shell看到fulltext命令确实有效:

index --get-config node_auto_index

返回的内容如下:

{
    "provider": "lucene",
    "type": "fulltext"
}

我最近使用MATCH子句对我的数据进行了一系列测试。我知道这使用了更现代的架构索引。我的结果很好,并返回了预期的数据。

我在某处读到,因为我的数据是在创建旧版索引之前导入的,所以我需要通过执行以下操作来手动索引相关属性:

START n=node(*)
WITH n SKIP {curr_skip} LIMIT {fixed_lim}
WHERE EXISTS(n.meta)
SET n.time=n.time, n.lat=n.lat, n.lon=n.lon, n.meta=n.meta
RETURN n

由于我有400万条记录,我的python处理程序通过{curr_skip}每次增加{fixed_lim}并执行查询直到得到0结果,将其作为一系列批处理操作。

在转换到昨天涉及START子句的测试后,我发现使用lucene查询,如:

START r=node:node_auto_index(lon:[{} TO {}]) RETURN count(r)

(填写范围)给了我糟糕的结果。我希望退回的数据不是。此外,不同的范围产生了奇怪的结果。范围(a,b)可能会产生1000个结果,但是(a-e,b + e),前一个范围的超集将产生0个结果!但是,timelat上完全相同的查询样式似乎完美无缺!更重要的是,我可以做一个多层次的查询,如:

START r=node:node_auto_index(time:[{} TO {}] AND lat:[{} TO {}]) RETURN count(r)

我最好的猜测是,我以某种方式损坏了lon的索引文件。

我在网上找到的建议是停止数据库,转到/path/to/graph.db,然后删除所有index*,然后重新启动数据库。在今天遵循这些指示后,我发现了更奇怪的行为。我从上面重新命名了相同的索引创建/配置语句,但在查询配置后,发现索引类型仍然是"type": "exact"。更奇怪的是,索引文件实际上并没有被创建! index下没有创建path/to/graph.db目录。

我确信我已经使用以下方式正确启动了shell:

neo4j-shell -path /path/to/graph.db/

如果我尝试使用index --create node_auto_index -t Node,我会收到already exists通知,但显然没有。

现在,我想我只是从头开始,看看我是否可以重现这些错误,或以某种方式绕过它们。

否则,如果有经验的人知道可能出现的问题,我会非常感谢一些意见!

更新:

所以我继续从头开始。

# ran my bulk import code
python3
>>> from mylib.module import load_data()
>>> load_data()
>>> # ... lots of printed stuff ...
IMPORT DONE in 3m 37s 950ms.
Imported:
  15394183 nodes
  15394171 relationships
  27651625 properties
Peak memory usage: 361.94 MB
>>> exit()

# switched out my new database
cd /path/to/neo4j-community-3.1.0
mv data/databases/graph.db data/databases/oldgraph.db
mv data/databases/newgraph.db data/databases/graph.db

# check neo4j is off
ps aux | grep neo

# neo4j shell commands
bin/neo4j-shell -path data/databases/graph.db/
... some warning about GraphAware Runtime disbaled.
... the welcome message

neo4j-sh (?)$ index --create node_auto_index -t Node
neo4j-sh (?)$ index --set-config node_auto_index fulltext
INDEX CONFIGURATION CHANGED, INDEX DATA MAY BE INVALID
neo4j-sh (?)$ index --get-config node_auto_index -t Node
{
    "provider": "lucene",
    "type": "exact"
}
neo4j-sh (?)$ exit # thought maybe I just had to restart

# try again
bin/neo4j-shell -path data/databases/graph.db/
neo4j-sh (?)$ index --get-config node_auto_index -t Node
{
    "provider": "lucene",
    "type": "exact"
}
neo4j-sh (?)$ index --set-config node_auto_index fulltext
INDEX CONFIGURATION CHANGED, INDEX DATA MAY BE INVALID
neo4j-sh (?)$ index --get-config node_auto_index -t Node
{
    "provider": "lucene",
    "type": "exact"
}
# hmmmmm
neo4j-sh (?)$ index --create node_auto_index -t Node
Class index 'node_auto_index' alredy exists
# sanity check
neo4j-sh (?)$ MATCH (r:record) RETURN count(r);
+----------+
| count(r) |
+----------+
| 4085814  |
+----------+
1 row
470 ms
neo4j-sh (?)$ exit

正如您所看到的,即使在重新创建新数据库之后,我也无法立即激活全文索引。我不知道为什么它提前几天而不是现在,因为我是唯一一个在这个服务器上工作的人!也许我甚至不得不重新安装neo4j。

更新/ IDEA:

好的,我对我的问题有一个潜在的想法,我认为它可能与权限相关。我有一个dashboard.py模块,我一直用来协调打开/关闭solr和neo4j。前几天,我有一些奇怪的问题,因为我无法在我的shell中执行启动/停止序列,所以我搞砸了很多权限。

让我来电话userA。我属于群组groupAgroupB

我记得昨天开始运行以下内容:

sudo chown -R $USER:groupB neo4j-community-3.1.0

我注意到我的python脚本生成的所有新数据库文件都属于组groupA。这可能是罪魁祸首吗?

我再次遇到奇怪的错误,我无法重新创建索引,因为它在删除后认为它仍然存在。我将再次重新运行批量导入,并在尝试设置全文索引之前修复这些权限。今晚会更新。

编辑:

这似乎没有效果:( 我甚至尝试chown将所有内容都设置为root,用户和组都无济于事。我的lucene索引不会从精确到全文变化。

我将继续现在全部重新安装。

更新:

甚至没有完全重新安装也有效。

我删除了我的整个neo4j-community-3.1.0文件夹,然后解压缩了我的tar包。 我将整个文件夹的所有权设置为我自己的(因为之前是nfsnobody):

chown -R $USER:mygroup neo4j-community-3.1.0 

我将这两行添加到neo4j.conf

dbms.auto_index.nodes.enabled=true
dbms.auto_index.nodes.keys=meta,lat,lon,time

我通过批量导入工具导入数据,然后执行与以前相同的索引创建/配置命令。索引在告诉我配置发生变化后仍在报告它正在使用exact lucene索引。

我在这里完全失败了。也许我会继续尝试我所拥有的START条款测试,看看它们是否有效。

更新:

WOOOOW。我想出了我的exact - > fulltext问题!!!

命令:

index --set-config node_auto_index fulltext

需要:

index --set-config node_auto_index type fulltext

难以置信。真是太糟糕了。关于索引被更改的输出消息实际上是什么让我失望,认为命令正在正确运行并且其他一些问题就在眼前。我应该为此向git提出请求吗?如果我不包括type

,这个命令是否真的会改变索引?

对于无效范围查询,我将很快进行测试。我相信当我第一次运行一些代码时,我的python处理程序中有一个错误,它没有遍历所有结果,在手动索引期间有效地错过了某些节点。一旦我再次完成此过程,我将运行测试以检查结果。

0 个答案:

没有答案