如何从Neo4j驱动程序中获取节点属性为Map类型
解决Neo4j原生驱动返回InternalNode转属性Map的问题
你可以通过两种方式把返回结果中的InternalNode转换为节点属性的Map<String, Object>:
方式一:使用Record.asMap()的重载方法自定义转换逻辑
利用Record.asMap(ValueMapper)方法,对每个值做类型判断,若为Node类型则提取其属性:
import org.neo4j.driver.types.Node; import org.neo4j.driver.Value; // ... List<Record> result = session.run(cql, params).list(); return result.stream() .map(record -> record.asMap((Value value, Class<?> type) -> { if (value.isNode()) { return value.asNode().properties(); } // 其他类型(如Relationship、基本类型)直接返回原对象 return value.asObject(); })) .collect(Collectors.toList());
方式二:遍历Record的Entry手动转换
逐个处理Record中的每个键值对,针对Node类型单独提取属性:
import org.neo4j.driver.types.Node; import org.neo4j.driver.Value; import java.util.HashMap; // ... List<Record> result = session.run(cql, params).list(); return result.stream() .map(record -> { Map<String, Object> convertedMap = new HashMap<>(); for (var entry : record.entrySet()) { Value value = entry.getValue(); if (value.isNode()) { convertedMap.put(entry.getKey(), value.asNode().properties()); } else { convertedMap.put(entry.getKey(), value.asObject()); } } return convertedMap; }) .collect(Collectors.toList());
关键说明
InternalNode是Neo4j驱动内部对Node接口的实现类,直接用Node接口的properties()方法就能获取节点的所有属性Map。Value.isNode()用于判断当前值是否为节点类型,value.asNode()可将其转为Node实例后操作。
内容的提问来源于stack exchange,提问作者orion_kid
相关产品推荐
相关产品推荐

