Neo4j Cypher: как перебрать результат ExecutionResult

Как в этом коде перебрать все узлы в результате ExecutionResult?

CypherParser parser = new CypherParser();
ExecutionEngine engine = new ExecutionEngine( graphDb );
Query query = parser.parse( "START n=node(2) MATCH (n)<-[:IS_A]-(x) RETURN x" );
ExecutionResult result = engine.execute( query );
// iterate over nodes in result and print all properties

person RichardW    schedule 28.12.2011    source источник


Ответы (4)


В javadoc для Cypher не очень ясно об этом, возможно, потому, что его нет.

Поэтому я воссоздал ваш код в «пробной версии», которая демонстрирует, как перебирать свойства узлов в совпадении. Домен представляет собой виды фруктов, где каждый вид связан с узлом «фрукты». Соответствующий фрагмент после выполнения запроса:

    Iterator<Node> kindsOfFruit = result.columnAs("x");
    while (kindsOfFruit.hasNext()) {
        Node kindOfFruit = kindsOfFruit.next();
        System.out.println("Kind #" + kindOfFruit.getId());
        for (String propertyKey : kindOfFruit.getPropertyKeys()) {
            System.out.println("\t" + propertyKey + " : " +
               kindOfFruit.getProperty(propertyKey));
        }
    }

Ключ result.columnAs("x"). Параметр с умным названием String n относится к «имени столбца» в предложении результата. В этом примере нам нужен столбец «x», и мы ожидаем, что он будет содержать Node объектов, поэтому мы можем присвоить прямо Iterator<Node>, а затем использовать это.

Если столбец не может быть найден, мы получим org.neo4j.graphdb.NotFoundException.

Если мы попросим о назначении не в тот класс, мы получим обычное java.lang.ClassCastException.

Полный рабочий пример доступен здесь: https://github.com/akollegger/neo4j-trials/blob/master/src/test/java/org/akollegger/neo4j/trials/richardw/ExecutionResultIteratorTrial.java

Надеюсь, это поможет.

Привет, Андреас

person akollegger    schedule 29.12.2011
comment
Я также добавил некоторые базовые пояснения в javadoc, которые можно просмотреть по адресу api.neo4j.org. - person akollegger; 30.12.2011
comment
Важно отметить, что это scala.collection.Iterator, а НЕ java.util.Iterator!!! - person jocull; 25.10.2013

Iterator<Object> columnAs = result.columnAs("n");
while(columnAs.hasNext())
{
Node n = (Node)columnAs.next();
for (String key : n.getPropertyKeys()) {
sysout("{ " + key + " : " + n.getProperty(key)+ " } ");
}

Это может помочь вам

person mayur rahatekar    schedule 28.08.2012

В более новых версиях java-драйвера можно пройти так.

Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "neo4j"));
Session session = driver.session();
List<String> teams = new ArrayList<>();

StatementResult cursor = session.run("match (l:League)<-[]-(t:Team) return t.short_name");
while (cursor.hasNext()) {
    teams.add(cursor.next().get(cursor.keys().get(0)).toString());
}

session.close();
driver.close();
person kometen    schedule 29.03.2018

person    schedule
comment
Это работает, когда x имеет одно значение в каждой строке. Если x имеет несколько значений в одной строке, как вы будете выполнять итерацию? (Для экс). под х, манго, апельсин, банан в первом ряду. груша, вишня во втором ряду. когда я работаю с таким примером, он выдает исключение класса. Есть ли у вас какие-либо идеи? - person priya; 10.01.2016