【问题标题】:How to get all node's relationships in neo4j using Java Connector Jar如何使用 Java Connector Jar 在 neo4j 中获取所有节点的关系
【发布时间】:2020-03-21 07:39:18
【问题描述】:

这是我的图表

我正在尝试获取节点的详细信息及其在 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, ]

JavaDoc 链接 -> 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 变量的一部分返回。

[更新] 并且第二个查询也没有返回关系

neo4j 浏览器中的结果和代码是一样的。

查询输出

MATCH (n:People) WITH COLLECT(n) AS 节点 MATCH (:People)-[r]->(:People) WITH 节点, COLLECT(TYPE(r)) AS rels 返回节点, rels

感谢您的帮助!

【问题讨论】:

    标签: neo4j cypher neo4j-java-api


    【解决方案1】:

    [更新]

    当前的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 人的。

    [附录]

    查看每个关系的类型和结束节点:

    String fetchQuery =
      "MATCH (a:People)-[r]->(b:People) " +
      "RETURN TYPE(r) AS type_r, a, b";
    

    【讨论】:

    • 感谢您的提示。不幸的是,上述方法不起作用。请检查我的更新部分并对其进行更多说明。
    • 修复了我的代码。第二个WITH需要通过nodes,否则变为unbound。
    • 嗨,cybersam,第二个查询现在运行但没有返回关系,请检查更新。
    • 查询正在返回关系(这就是rels 显示多个映射的原因),但您的关系没有属性(因此映射为空)。例如,您可以使用COLLECT(TYPE(r)) 而不是COLLECT(r) 来查看关系类型。或者,您可以将属性添加到您的关系中。
    • COLLECT(TYPE(r)) -> 集体返回所有关系,而不是单个节点的关系。请检查更新的图像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多