Cypher中大整数ID导入失败及字符串ID匹配问题求助
解决Neo4j中超大ID存储与字符串匹配失败的问题
1. 如何将超大数值的actorId转为整数形式存储
Neo4j里的toInteger()对应的是32位整数,范围仅限-2^31到2^31-1,一旦你的actorId超出这个区间就会触发报错。要搞定这个问题,换成toLong()函数就行——它支持64位整数,能覆盖大得多的数值范围。
修改你的导入语句,把actorId的转换逻辑换成toLong():
LOAD CSV FROM 'file:///desktop-csv-import/moviestoactors.csv' AS row WITH row[0] AS movieId, toLong(row[1]) AS actorId, row[2] AS as_character, row[3] AS leading MERGE (m:moviestoactors {movieId:movieId }) SET m.actorId = actorId, m.as_character = as_character, m.leading = leading RETURN count(m)
这样actorId就会以64位整数类型存储,再也不会出现数值超限的问题。
2. 字符串类型的actorId匹配失败的原因及解决方法
可能的原因
最常见的问题是CSV里的actorId字段带了前后空格或不可见字符,导致你存的字符串和查询时输入的'244663'完全不匹配。比如CSV里的实际值可能是' 244663 '或者藏了换行符,肉眼看不出,但字符串匹配是严格区分这些细节的。
另外也有可能是CSV格式问题,比如字段被额外的引号包裹,导致存储的字符串是'"244663"'而非'244663'。
解决方法
先排查存储的真实值:执行下面的查询,看看actorId的实际内容,确认有没有多余字符:
MATCH(ma:moviestoactors) WHERE ma.actorId STARTS WITH '24466' RETURN ma.actorId, size(ma.actorId)如果
size(ma.actorId)大于6,说明确实存在额外字符。导入时提前清理数据:修改导入语句,用
trim()函数去掉字符串前后的空格和不可见字符:LOAD CSV FROM 'file:///desktop-csv-import/moviestoactors.csv' AS row WITH row[0] AS movieId, trim(row[1]) AS actorId, row[2] AS as_character, row[3] AS leading MERGE (m:moviestoactors {movieId:movieId }) SET m.actorId = actorId, m.as_character = as_character, m.leading = leading RETURN count(m)查询时兼容脏数据:如果已经导入了带多余字符的数据,可以在查询时用
trim()来匹配:MATCH(ma:moviestoactors) WITH ma.movieId AS movieId WHERE trim(ma.actorId) = '244663' RETURN movieId
内容的提问来源于stack exchange,提问作者Huwaiza
相关产品推荐
相关产品推荐

