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

时间:2018-06-30 05:44:16

标签: jdbc neo4j

在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

1 个答案:

答案 0 :(得分:0)

我们无法使用instanceof运算符来识别不同的类加载器。由于jdbc驱动程序位于Tomcat / lib中,因此被判断为与应用程序加载的类不同。

在任何情况下,都可以通过将List转换为List来提供,或者直到支持getResults()作为getArray()的返回值为止。认为有必要编写。