neo4j ogm, получить количество узлов, соответствующих конкретному запросу
У меня есть 3 типа узлов в моем graphDb. Skill
, SkillSubCluster
& SkillCluster
, Skill
узел подключен к одному или нескольким SkillSubCluster
узел (отношение 1 ко многим) и SkillSubCluster
узел подключен к одному SkillCluster
узел (отношение 1 к 1).
Я хочу найти все навыки с учетом skillCluster
название. Я пришел с этим запросом шифра -
match(n:SkillCluster {CleanedText: "arts"}) match(n)<-[parent]-(x)<-[belongsTo]-(y) return y
Количество узлов может быть большим, поэтому я думаю о возвращении постраничного результата. Это можно легко сделать, используя skip
а также limit
операторы. Также я хотел бы вернуть общее количество навыков для данного skillCluster
узел.
соответствующий cypher
запрос будет
match(n:SkillCluster {CleanedText: "arts"}) match(n)<-[parent]-(x)<-[belongsTo]-(y) return count(y)
Я пытаюсь сделать то же самое, используя neo4j-ogm для Java.
Мой класс навыков
public class Skill {
@Id @GeneratedValue
private Long id;
private String Name;
private String CleanedText;
@Relationship(type = "BelongsTo", direction = Relationship.OUTGOING)
private Set<SkillSubCluster> belongsTo = new HashSet<>();
}
Соответствующий класс DAO
public class SkillDAO extends GenericDAO<Skill>{
public SkillDAO(Session session) {
super(session);
}
protected Class<Skill> getEntityType() {
return Skill.class;
}
}
и мой общий класс DAO -
public abstract class GenericDAO<T> {
private static final int DEPTH_LIST = 0;
private static final int DEPTH_ENTITY = 1;
private Session session;
public long filterCount(Iterable<Filter> filters){
return session.count(getEntityType(), filters);
}
public T find(Long id) {
return session.load(getEntityType(), id, DEPTH_ENTITY);
}
public T find(String name) {
return session.load(getEntityType(), name, DEPTH_ENTITY);
}
public void delete(Long id) {
session.delete(session.load(getEntityType(), id));
}
public void createOrUpdate(T entity) {
session.save(entity, DEPTH_ENTITY);
//return find(entity.id);
}
protected abstract Class<T> getEntityType();
public GenericDAO(Session session) {
this.session = session;
}
}
Можно ли вернуть объекты, кроме Skill
Класс или получить результаты комплекса cypher
запросы как group by
и т.п.
1 ответ
Поработав некоторое время, я придумал правильный способ сделать это. Поэтому в моем абстрактном классе GenericDAO мне пришлось добавить следующий метод -
public abstract class GenericDAO<T> {
// Rest of the implementation from above
public Result runComplexQuery(String query){
return session.query(query, Collections.emptyMap());
}
// ..................
}
а затем следующий код, чтобы получить счет
public long getNodeCount(String clusterName){
query = "match(n:SkillCluster {CleanedText: \"" + clusterName.toLowerCase() + "\"}) "
+ "match(n)<-[parent]-(x)<-[belongsTo]-(y) return count(y) as numSkillNodes";
Iterable<Map<String, Object>> results = skillSubClusterDAO.runComplexQuery(query);
for(Map<String, Object> row: results){
count = (long) row.get("numSkillNodes");
System.out.println(count);
}
}