我通过GraphDatabaseService访问neo4j数据库。我添加了一些节点和关系,并希望进行查询。我的目标是获取所有与该端节点具有呼叫关系的节点。所以我有到这个节点的全部路径。 (例如:node1 -calling-> node2 -calling *-> nodeX -calling-> endnode)

我尝试过这样的事情:

GraphDatabaseService _graphDatabase; // db is running and working fine
Node node;//given by the function call

HashMap<String, Object> properties = Maps.newHashMap();
properties.put("name", getPropertyFromNode(node, "name"));
String query = "MATCH p=(startnode)-[rel:CALLING*]->(endnode) WHERE endnode.name = {name} RETURN p";

Result result = _graphDatabase.execute(query, properties);
while (result.hasNext()) {
    Map<String, Object> next = result.next();
    next.forEach((k, v) -> {
        System.out.println(k + " : " + v.toString());
        if (v instanceof PathImpl) {
            PathImpl pathImpl = (PathImpl) v;
            String startNodeName = getPropertyFromNode(pathImpl.startNode(), "name");
            String endNodeName = getPropertyFromNode(pathImpl.endNode(), "name");
            System.out.println(startNodeName + " -calling-> " + endNodeName);
        }
    });
}

public String getPropertyFromNode(Node node, String propertyName) {
    String result = null;
    try (Transaction transaction = _graphDatabase.beginTx()) {
        result =node.getProperty(propertyName).toString();
        transaction.success();
    }
    return result;
}


我的问题是,结果是Map ,我想获取关系中节点的ID或名称。我试图将Object强制转换为PathImpl,因为多数民众赞成返回的类型(通过调试弄清楚),但它的接缝好像是该类在不同的类加载器中,因此语句instanceof返回false。
v.toString()返回具有ID的喜欢节点的字符串表示形式(例如:p:(24929)-[CALLING,108061]->(24930))

我的问题是,我能以更好的方式访问此信息还是如何更改classLoader(如果是问题,我正在gradle项目中使用eclipse)以使转换发生。
我不想解析String以获取ID并通过该属性从db获取节点,它对我来说接缝很难看。

最佳答案

如果要获取起点和终点的名称,则应修改Cypher代码以返回它们(而不是路径),这将大大简化从响应中提取数据所需的代码。例如:

MATCH p=(startnode)-[rel:CALLING*]->(endnode)
WHERE endnode.name = {name}
RETURN startnode.name AS s_name, endnode.name AS e_name, p;

08-20 00:05