我正在使用Neo4j
图形数据库,并使用 Java 从中提取路径。我有如下路径:
[(3)--[KNOWS,5]-->(4)--[KNOWS,6]-->(5)--[KNOWS,9]-->(6)--[KNOWS,10]-->(7)--[KNOWS,12]-->(9)]
我想用它们的属性替换路径中的节点 ID。前任。对于具有属性的节点 id 3 "name=ABC"
,输出应该像"[(ABC)--[KNOWS,5]....]"
How it can be done?
我正在使用Neo4j
图形数据库,并使用 Java 从中提取路径。我有如下路径:
[(3)--[KNOWS,5]-->(4)--[KNOWS,6]-->(5)--[KNOWS,9]-->(6)--[KNOWS,10]-->(7)--[KNOWS,12]-->(9)]
我想用它们的属性替换路径中的节点 ID。前任。对于具有属性的节点 id 3 "name=ABC"
,输出应该像"[(ABC)--[KNOWS,5]....]"
How it can be done?
我假设我们显示的输出是Path.toString()。没有直接的方法来配置不同的输出方式。但是,您可以轻松地遍历路径并创建自己的路径字符串表示:
String myCustomPathToString(Path path) {
StringBuilder sb = new StringBuilder();
Node lastNode = null;
for (PropertyContainer propertyContainer: path) {
if (propertyContainer instanceof Node) {
lastNode = (Node)propertyContainer
Object default = lastNode.getId(); // as fallback
sb.append("(").append(propertyContainer.getProperty("name", default).append(")");
}
if (propertyContainer instanceof Relationship) {
Relationship rel = (Relationship)propertyContainer ;
Object id = rel.getId();
if (rel.getEndNode().equals(lastNode)) sb.append("<");
sb.append("--[").append(rel.getType().name()).append(",").append(id).append("]--");
if (rel.getStartNode().equals(lastNode)) sb.append(">");
}
}
return sb.toString();
}
免责声明:我没有测试上面的代码段,所以它更像是一个指导而不是一个工作示例。
对于 Cypher,您可以使用提取:
START n=node:index(key="value")
MATCH path=n-[:KNOWS*..5]-m
RETURN extract(x in nodes(path) : x.name)
如果你想保持关系,你可以这样做:
RETURN extract(x in path : coalesce(x.name?,ID(x)+":"+type(x)))