Neo4j加载跨类型资产关系时,如何无需额外标签利用索引?
Neo4j多标签资产节点的关系加载优化问题
我有多种带不同标签的资产节点(如Asset1、Asset2),节点间可任意建立连接;不同类型资产节点的字段不同,但都包含共同的id字段。节点数据分别存储在asset1.csv、asset2.csv等文件中,关系数据存储在connection.csv,表头为asset_1_id、asset_1_type、asset_2_id、asset_2_type。
节点加载操作
加载节点的逻辑很简单:
LOAD CSV WITH HEADERS FROM 'file:///assetN.csv' AS row CREATE (n:AssetN { id: row.id, // AssetN的其他字段 })
加载节点前,我已经为每种资产类型单独创建了索引:
CREATE INDEX assetN_id IF NOT EXISTS FOR (n:AssetN) ON (n.id);
关系加载的尝试与问题
方案一:无标签匹配(无法终止执行)
最初尝试的关系加载语句一直无法执行完成:
LOAD CSV WITH HEADERS FROM 'file:///connection.csv' AS row MATCH (asset1 { id: row.asset_1_id }) MATCH (asset2 { id: row.asset_2_id }) MERGE (asset1)-[:CONNECTED_TO]-(asset2)
能看出不指定标签的话,Neo4j不会使用已创建的索引。我理解可能存在部分资产未建索引的情况,但希望它优先尝试使用索引,失败后再默认全量扫描。
方案二:APOC动态标签(仍无法终止执行)
之后我尝试用APOC从CSV中动态读取标签,但执行还是无法结束,看起来依旧没有用到索引:
LOAD CSV WITH HEADERS FROM 'file:///connection.csv' AS row CALL apoc.merge.node([row.asset_1_type], { mrid: row.asset_1_id }) YIELD node as asset1 CALL apoc.merge.node([row.asset_2_type], { mrid: row.asset_2_id }) YIELD node as asset2 MERGE (asset1)-[:CONNECTED_TO]-(asset2)
当前可行但不满意的方案
目前唯一能快速执行的方案是给每个节点添加一个通用的Asset标签,然后在该标签上创建索引,再加载关系:
LOAD CSV WITH HEADERS FROM 'file:///connection.csv' AS row MATCH (asset1:Asset { id: row.asset_1_id }) MATCH (asset2:Asset { id: row.asset_2_id }) MERGE (asset1)-[:CONNECTED_TO]-(asset2)
这个方案速度很快,因为确实用到了索引,但我不想只为了优化数据加载就给所有节点添加额外标签。
请问还有其他可行的解决方案吗?
内容的提问来源于stack exchange,提问作者Prassi
相关产品推荐
相关产品推荐

