Как neo4j jdbc (bolt) будет обрабатывать запросы, которые возвращают список узлов? - PullRequest
0 голосов
/ 30 июня 2018

В 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);
                }

Такие запросы создаются с помощью таких операторов шифрования. Такие запросы создаются с помощью таких операторов шифрования.

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 голосов
/ 03 июля 2018

Это было для разных загрузчиков классов, которые мы не можем идентифицировать с оператором instanceof. Поскольку драйвер jdbc был помещен в Tomcat / lib, он был оценен как отличающийся от класса, загруженного приложением.

В любом случае это будет обеспечиваться путем преобразования List в List или до тех пор, пока getResults () не будет поддерживаться как возвращаемое значение getArray (). Считается, что необходимо писать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...