【发布时间】:2017-07-13 08:15:26
【问题描述】:
我尝试用 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;
}
此函数导致以下异常拒绝启动 Neo4j:
“参数ResourceIterator<Node>在passName中的位置0处
类型 Label 无法转换为 Neo4j 类型:不知道如何将 org.neo4j.graphdb.ResourceIterator 映射到 Neo4j 类型系统。”
然后我尝试使用将 ResourceIterator 转换为 Stream
Stream<Node> nodesStream = nodes.stream();
同样的错误 - Neo4j 无法映射 Stream..
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");
编辑
使用模式将@UserFunction 更改为@Procedure 后。阅读:
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;
}
}
在这种情况下,我得到:“必须将具有零输出字段的程序声明为 VOID”。
有什么想法吗? 谢谢!
【问题讨论】:
标签: java neo4j neo4j-apoc neo4j-plugin