我通过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;