代码之家  ›  专栏  ›  技术社区  ›  Grapheneer

如何使用Java插件在Neo4j中返回多个节点?

  •  1
  • Grapheneer  · 技术社区  · 7 年前

    我试图用Java编写一个函数,在Neo4j图形数据库中查找具有相同名称和标签的节点。

    @UserFunction(value = "boris.example")
    @Description("finds nodes with same name")
    
       public  ResourceIterator<Node> passName(@Name("nodeId") long nodeId)
       {
            Node nodeX = null;
    
            Node node = db.getNodeById( nodeId ); //Find node with spcific ID
            Object nameVal = node.getProperties("name"); //Get its name
            Label label = Label.label("VersionableObject"); //Decl. of label
    
            // Find nodes by label and name
            ResourceIterator<Node> nodes = db.findNodes(label, "name", nameVal); 
            nodes.close();
    
            return nodes;
       }
    

    “参数 ResourceIterator<Node> 在中的位置0处 passName 具有 类型 Label org.neo4j.graphdb.ResourceIterator Neo4j型系统。”

    Stream<Node> nodesStream = nodes.stream();
    

    同样的错误-Neo4j无法映射流。。

    ResourceIterator<Node> nodes = db.findNodes(label, "name", nameVal);    
    
            while (nodes.hasNext()) {
    
                nodeX = nodes.next();
    
            }
            nodes.close();
    
    return nodeX;
    

    Neo4j中的输出为空,即使它应该找到3个节点。

    将流转换为数组或列表也不起作用。

    Node node = db.getNodeById( nodeId );
    Map<String, Object> propertyMap = node.getProperties("name");
    

    编辑

    package org.neo4j.example.procedure_template;
    
    
    import org.neo4j.graphdb.ResourceIterator;
    import java.util.stream.Stream;
    import org.neo4j.graphdb.GraphDatabaseService;
    import org.neo4j.graphdb.Label;
    import org.neo4j.graphdb.Node;
    import org.neo4j.logging.Log;
    import org.neo4j.procedure.*;
    import org.neo4j.procedure.Description;
    import org.neo4j.procedure.Name;
    
    
    public class FindNode {
    
        @Context
        public GraphDatabaseService db;
    
        @Context
        public Log log;
    
    
        public FindNode() {
        }
    
        @Procedure(value = "boris.getAllNodesWithProperty", mode = Mode.READ)
        @Description("boris.getAllNodesWithProperty - finds Node by ID and return defined Property")
    
           public Stream<Node> passName(@Name("nodeId") long nodeId)
    
           {
            Node node = db.getNodeById( nodeId );
            Object nameVal = node.getProperties("name");
            Label label = Label.label("VersionableObject");
    
            ResourceIterator<Node> nodes = db.findNodes(label, "name", nameVal);
            Stream<Node> nodesStream = nodes.stream();
    
            return nodesStream;
           }
    
    } 
    

    有什么想法吗? 非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   logisima    7 年前

    user defined function procedure .

    A. 只是一个转换器,它是只读的,返回一个类型,可以是: long, Long, double, Double, boolean, Boolean, String, Node, Relationship, Path, Map<String, Object, or List<T>

    A. 可以接受参数,对数据库执行操作,并返回结果(作为流)。

    在代码中,您定义了 user function ,我想你想要的是 程序 ResourceIterator Neo4j Type System .

    您必须进行这些更改:

    • @UserFunction(value = "boris.example") 通过 @Procedure(value = "boris.example", mode = Mode.READ)
    • Stream<Node>

    干杯

    编辑

    程序必须返回 pojo 或简单类型。所以你必须把你的 Node 在这样的pojo中:

    public class FindNode {
    
        @Context
        public GraphDatabaseService db;
    
        @Context
        public Log log;
    
    
        @Procedure(value = "boris.getAllNodesWithProperty", mode = Mode.READ)
        @Description("boris.getAllNodesWithProperty - finds Node by ID and return defined Property")
        public Stream<NodeResult> passName(@Name("nodeId") long nodeId)
    
        {
            Node node = db.getNodeById( nodeId );
            Object nameVal = node.getProperty("name");
            Label label = Label.label("VersionableObject");
    
            ResourceIterator<Node> nodes = db.findNodes(label, "name", nameVal);
    
            return nodes.stream().map( item -> new NodeResult(item));
        }
    
        public class NodeResult {
    
            public final Node node;
    
            public NodeResult(Node node) {
                this.node = node;
            }
        }
    
    
    }