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);
    }
}
Другие вопросы по тегам