在neo4j jdbc(螺栓)中,Node作为Map返回,但是如果您进行查询以返回Nodes列表,则getObject()将返回InternalNodes列表。该列表中的实体无法通过instanceof类型进行标识,因此反射将通过类型名称标识节点,并且您将通过反射调用方法来获取值。您可以通过执行以下操作来获取值,但是这种方法正确吗? rs是ResultSet。entity是此方法的返回值。
Object columnObject = rs.getObject(columnName);
if (columnObject instanceof List<?>){
List<Map<String,Object>> objectValue = arrayList();
Array columnArray = rs.getArray(columnName);
Object[] columnArrayValues = (Object[]) columnArray.getArray();
for (int iTmp = 0; iTmp < columnArrayValues.length; iTmp++){
Map<String, Object> colArrayItemMap = new HashMap<>();
Object colItemObj = columnArrayValues[iTmp];
Class colItemClass = colItemObj.getClass();
if (colItemClass.getName().equals("org.neo4j.driver.internal.InternalNode")){
Method asMap = colItemClass.getMethod("asMap");
Method getId = colItemClass.getMethod("id");
Method getLabels = colItemClass.getMethod("labels");
colArrayItemMap.put("_id", getId.invoke(colItemObj));
colArrayItemMap.put("_labels", getLabels.invoke(colItemObj));
colArrayItemMap.putAll((Map<? extends String, ?>) asMap.invoke(colItemObj));
} else {
colArrayItemMap.put("_raw", columnArrayValues[iTmp]);
}
objectValue.add(colArrayItemMap);
}
((Map) entity).put(propertyName, objectValue);
} else {
((Map) entity).put(propertyName, columnObject);
}
此类查询由此类cypher语句生成。此类查询由此类cypher语句生成。
MATCH
(input:Input),
(output:Output)
WITH input, output
MATCH
(input)-[:INPUT*1]->(in),
(out)-[:OUTPUT*1]->(output),
g = (in)-[connect:CONNECT*0..5]->(out)
RETURN
input, output, extract(x IN nodes(g)|x) as nodes
答案 0 :(得分:0)
我们无法使用instanceof运算符来识别不同的类加载器。由于jdbc驱动程序位于Tomcat / lib中,因此被判断为与应用程序加载的类不同。
在任何情况下,都可以通过将List转换为List来提供,或者直到支持getResults()作为getArray()的返回值为止。认为有必要编写。