neo4j jdbc (bolt) 将如何处理返回节点列表的查询?



在neo4j jdbc(bolt(中,Node以Map 的形式返回,但是如果你进行一个返回节点列表的查询,getObject ((将返回一个InternalNodes列表。此列表中的实体无法通过类型实例标识,因此反射将按类型名称标识节点,您将通过通过反射调用方法来获取值。您可以通过执行以下操作来获取值,但这种方法是否正确?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);
}

此类查询由此类密码语句生成。此类查询由此类密码语句生成。

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

对于不同的类加载器,我们无法识别实例运算符。由于 jdbc 驱动程序被放置在 Tomcat/lib 中,因此它被判断为与应用程序加载的类不同。

无论如何,它将通过将List转换为List来提供,或者直到getResults((被支持为getArray((的返回值,认为有必要编写。

最新更新