如何用它们各自的属性替换节点ID?

时间:2013-03-20 12:03:57

标签: java neo4j graph-traversal

我正在使用Neo4j用于图形数据库,并使用Java从中提取路径。 我的路径如下:

[(3)--[KNOWS,5]-->(4)--[KNOWS,6]-->(5)--[KNOWS,9]-->(6)--[KNOWS,10]-->(7)--[KNOWS,12]-->(9)]

我想用它们的属性替换路径中的节点ID。 恩。对于属性为"name=ABC"的节点ID 3,输出应为"[(ABC)--[KNOWS,5]....]" 怎么做?

2 个答案:

答案 0 :(得分:2)

我假设我们显示的输出是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();
}

免责声明:我没有测试上面的代码片段,因此它更像是一个指导而非工作示例。

答案 1 :(得分:1)

对于Cypher,您可以使用extract:

  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)))

请参阅:http://console.neo4j.org/r/zvmyz