Я пытаюсь создать свою собственную функцию для neo4j, которая рекурсивно проходит через граф и возвращает все узлы и ребра, которые связаны с ребром с длинным значением больше 100.
Я знаю, что есть простой запрос CYPHER для этого, но, делая это, я могу знать, как выполнить более сложные вещи самостоятельно.
псевдокод
- получить все отношения из узла, совпадающего с идентификатором, где это отношение типа TypeExample.
- если отношение имеет длинное свойство Count и Count> 100, переходите к 1.
ЕСЛИ 5 узлов глубоко, остановитесь. вернуть список узлов и ребер с интерфейсом IPath.
package example;
import java.util.Iterator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
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;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.index.IndexManager;
public class NodeFinder {
@Context
public GraphDatabaseService db;
@Context
public Log log;
@Procedure
@Description("finds Nodes one step away")
public Stream<SomeList> GetRelations(@Name("nodeId") long nodeId, @Name("depth") long depth, @Name("rel") String relType) {
Recursive(nodeId);
//return list of Nodes and Edges
}
private void Recursive(long id) {
Node node = db.getNodeById(nodeId);
Iterable<Relationship> rels = node.getRelationships();
for (Relationship rel : rels) {
long c = (long) rel.getProperty("Count");
if (c > 100) {
Recursive(rel.getEndNodeId());
}
}
}
}