Neo4j-admin import能否为不同ID空间指定不同ID类型?
Great question! Let's break down how Neo4j's neo4j-admin import handles ID types and what options you have here.
Core Limitation: No Per-ID-Space Type Support
First, the straight answer: Neo4j does not currently support specifying different ID types for different ID spaces when using neo4j-admin import. The --id-type flag is a global setting that applies to all ID spaces in your import job. This means you can't have one ID space using integers and another using strings in the same import.
Why Your Attempt Failed
When you tried adding :int to your CSV header like uid:ID(User-ID):int, you were actually defining the data type of the uid node attribute—not the type of the ID space itself. The :ID(User-ID) part tells Neo4j that this column represents identifiers in the User-ID space, but the parsing of those identifiers (whether as integers or strings) is still controlled by the global --id-type setting.
If --id-type was set to STRING, Neo4j would read the uid values as strings even though you marked the attribute as int, causing a type mismatch. If --id-type was set to INTEGER, any non-integer values in other ID spaces (like your address-id strings) would fail to parse. That's why your configuration didn't work as expected.
Workaround Options
Since per-ID-space types aren't supported, here are practical workarounds to handle mixed ID types:
Unify ID Types Globally
The simplest fix is to convert all ID values to a single compatible type. For example:- Convert all integer IDs to strings (e.g.,
123→"123"), then set--id-type=STRING. Strings can handle both numeric and alphanumeric IDs without issue. - If all string IDs are numeric (like
"456"), convert them to integers and use--id-type=INTEGER.
- Convert all integer IDs to strings (e.g.,
Preprocess IDs with Prefixes
If you need to preserve the original ID type context, add a prefix to distinguish ID spaces during preprocessing. For example:- User IDs:
123→"user_123" - Address IDs:
"main_st"→"addr_main_st"
Then set--id-type=STRINGfor the import. After importing, you can strip the prefixes if needed using Cypher queries.
- User IDs:
Import with String IDs, Then Convert Attributes
Import all IDs as strings (--id-type=STRING), making sure to define attribute types correctly in your CSV headers (e.g.,uid:ID(User-ID):intfor user nodes,addr_id:ID(Address-ID):stringfor address nodes). After import, run a Cypher query to convert user ID attributes to integers:MATCH (u:User) SET u.uid = toInteger(u.uid)This only adjusts the node attribute for post-import queries, not the underlying ID space used during the import process.
内容的提问来源于stack exchange,提问作者juanawang

