2017-07-19 44 views
1

在Cypher支架返回邻国应该是这样的:如何使用java插件在Neo4j中返回节点邻居?

START n=node({nodeId}) MATCH n--m RETURN m; 

我努力创建一个Java插件,做同样的。之后我想查看返回的邻居的属性等等。这是我的代码,我试图获得关系和他们的EndNodes。我究竟做错了什么?我只返回节点本身,但没有从“while-Loop”中返回。

import java.util.Iterator; 
import java.util.stream.Stream; 
import org.neo4j.graphdb.GraphDatabaseService; 
import org.neo4j.graphdb.Label; 
import org.neo4j.graphdb.Node; 
import org.neo4j.graphdb.Relationship; 
import org.neo4j.graphdb.ResourceIterator; 
import org.neo4j.logging.Log; 
import org.neo4j.procedure.*; 
import org.neo4j.procedure.Description; 
import org.neo4j.procedure.Name; 

public class Correlation { 

@Context 
public GraphDatabaseService db; 

@Context 
public Log log; 


@UserFunction(value = "boris.getNeighbours") 
@Description("boris.getNeighbours- finds Nodes one step away") 
public Node passName2(@Name("nodeId") long nodeId) 

{ 

    Node node = db.getNodeById(nodeId); 
    Iterable<Relationship> rels = node.getRelationships(); 
    Iterator<Relationship> I_rel = rels.iterator(); 

    while (I_rel.hasNext()) { 
     Relationship rel = I_rel.next(); 
     Node endNode = rel.getEndNode(); 
     return endNode; 
    } 
return node; 
} 
} 

回答

0

这工作:

public class NodeFinder { 

@Context 
public GraphDatabaseService db; 

@Context 
public Log log; 

@Procedure 
@Description("finds Nodes one step away") 
public Stream<NodeResult> passName2(@Name("nodeId") long nodeId) 

{ 

    Node node = db.getNodeById(nodeId); 
    Iterable<Relationship> rels = node.getRelationships(); 
    Stream<Relationship> relsStream = StreamSupport.stream(rels.spliterator(), false); 
    Stream<NodeResult> myNodes = relsStream.map(r -> new NodeResult(r)); 

    return myNodes; 

} 


public class NodeResult 
{ 
    //What i return 
    public Node node; 

    //Constructor 
    public NodeResult(Relationship item) 
    {    
     this.node = item.getEndNode(); 
    } 

} 
}