gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:36:51 25 4
gpt4 key购买 nike

我尝试用 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 无法映射流..

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

编辑

使用 mode.READ 将 @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”。

有什么想法吗?谢谢!

最佳答案

在 Neo4j 中,您可以通过创建一些自定义的 user defined function 来扩展 Cypher或procedure .

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

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

在您的代码中,您定义了 user function ,我想你想要的是 procedure 。这就是为什么你有 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;
}
}


}

关于java - 如何使用Java插件在Neo4j中返回多个节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45075084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com