Как получить отношения всех узлов в neo4j, используя Java Connector Jar - PullRequest
0 голосов
/ 21 марта 2020

Вот мой график

enter image description here

Я пытаюсь получить подробную информацию об узлах и их отношениях в java коде, а ниже мой код. Я могу получить детали узлов, но не отношения. И у java документов нет информации и методов, которые позволяют разоблачать отношения.

Мой код

import java.util.List;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Record;
import org.neo4j.driver.Result;
import org.neo4j.driver.Session;
import org.neo4j.driver.Value;
import org.neo4j.driver.internal.InternalResult;

public class Neo4jTest {

    private Driver driver;

    public Neo4jTest() {
        loadDriver();
    }

    private void loadDriver() {
        driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "Test"));
    }

    public Result createNodes(String query) {
        try (Session session = driver.session())
        {
            InternalResult result = (InternalResult) session.writeTransaction(tx -> tx.run(query));
            return result;
        }
    }

    public List<Record> execute(String query) {
        try (Session session = driver.session())
        {
            Result result = session.run(query);
            return result.list();
        }
    }

    public void cleanUp(String object) {
        String cleanUpQuery = "match(n:" + object +") detach delete n";
        execute(cleanUpQuery);
    }

    public void printResults(List<Record> results) {
        for (Record record : results) {
            Value rec = record.get("n");
            System.out.print("Record --> [");
            for (String key : rec.keys()) {
                System.out.print(key + " : " + rec.get(key) + ", ");
            }
            System.out.println("]");

            //TODO: Need to get all Relationship of this particular node
        }
    }

    public static void main(String[] args) {

        String createQuery = "create \n" + 
                "(a:People {name : \"Vivek\", age : 20}), \n" + 
                "(b:People {name : \"Abdul\", age : 25}), \n" + 
                "(c:People {name : \"John\", age : 22}),\n" + 
                "" +
                "(a)-[:KNOWS]->(b),\n" + 
                "(b)-[:FRIEND_OF]->(c),\n" + 
                "(c)-[:KNOWS]->(a)";

        String fetchQuery = "match(n:People) return n";

        Neo4jTest obj = new Neo4jTest();
        obj.cleanUp("People");

        // Create Nodes
        obj.createNodes(createQuery);

        // Fetch Nodes
        List<Record> results = obj.execute(fetchQuery);

        // Process Results
        obj.printResults(results);

    }
}

Выход

Record --> [name : "Vivek", age : 20, ]
Record --> [name : "Abdul", age : 25, ]
Record --> [name : "John", age : 22, ]

JavaDo c Ссылка -> https://neo4j.com/docs/api/java-driver/current/

Соответствующие объекты результата

org.neo4j.driver.Record;
org.neo4j.driver.Value;

Другие детали

Neo4j Версия сообщества - 3.5.14

Neo4j Java Версия драйвера - 4.0.0

Обновление

(для ответа cybersam)

Первый запрос не возвращает отношения как часть переменной r. enter image description here

[Обновить] И второй запрос также не возвращает отношения enter image description here

Результаты в браузере и коде neo4j такие же.

Вывод для запроса

MATCH (n: People) С COLLECT (n) AS узлы MATCH (: People) - [r] -> (: People) С узлами, COLLECT (TYPE ( r)) AS rels RETURN узлы, rels

enter image description here

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 21 марта 2020

[ОБНОВЛЕНО]

Текущий fetchQuery только запрашивает и возвращает узлы.

Вы можете использовать это вместо (и внести соответствующие изменения в printResults):

String fetchQuery = "MATCH (n:People)-[r]-(m:People) RETURN n, r, m";

Или, вы можете использовать это (который возвращает отдельные списки для People узлов и отношений между ними, но менее эффективно):

String fetchQuery =
  "MATCH (n:People) WITH COLLECT(n) AS nodes " +
  "MATCH (:People)-[r]->(:People) WITH nodes, COLLECT(r) AS rels" +
  "RETURN nodes, rels";

Кстати, People действительно должно быть Person, поскольку каждый узел предназначен для 1 человека.

[ADDENDUM]

Чтобы увидеть тип и конечные узлы каждого отношения:

String fetchQuery =
  "MATCH (a:People)-[r]->(b:People) " +
  "RETURN TYPE(r) AS type_r, a, b";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...