2017-01-09 2 views
0

Сейчас из-за открытым вопрос GitHub https://github.com/neo4j/neo4j-ogm/issues/215 в Neo4j OGM я должен использовать следующий метод обход для того, чтобы преобразовать org.neo4j.ogm.session.Session.query результат, который возвращает @QueryResult в список этого @QueryResult:SDN4, Neo4j OGM @QueryResult Session.query и Pagable

Пример Cypher запроса:

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) WHERE id(parentD) = {decisionId} OPTIONAL MATCH (childD)<-[:VOTED_FOR]-(vg:VoteGroup)-[:VOTED_ON]->(c:Criterion) WHERE id(c) IN {criteriaIds} WITH childD, ru, u, vg.avgVotesWeight as weight OPTIONAL MATCH (childD)<-[:SET_FOR]->(sortValue375:Value)-[:SET_ON]->(sortCharacteristic375:Characteristic) WHERE id(sortCharacteristic375) = 375 RETURN childD AS decision, ru, u, toFloat(sum(weight)) as weight, sortValue375 ORDER BY weight DESC, sortValue375.value DESC, childD.createDate DESC SKIP 0 LIMIT 1000 

Обход:

@QueryResult 
public class WeightedDecision { 

    private Decision decision; 

    private Double weight; 

... 
} 

Result queryResult = session.query(characteristicCypher, parameters); 

List<WeightedDecision> weightedDecisions = new ArrayList<>(); 

for (Map<String, Object> result : queryResult) { 
    WeightedDecision weightedDecision = new WeightedDecision(); 
    weightedDecision.setDecision((Decision) result.get("decision")); 
    weightedDecision.setWeight((double) result.get("weight")); 
    weightedDecisions.add(weightedDecision); 
} 

Сейчас в вместо List<WeightedDecision> Я должен вернуть Page<WeightedDecision>

Как это можно сделать? Пожалуйста, помогите мне изменить код, чтобы перевести queryResult в Page<WeightedDecision>

Также, как обеспечить countQuery в этой логике?

ответ

1

Ссылаясь на это сообщение Conversion of List to Page in Spring, вы можете преобразовать из результирующего списка в экземпляр Page с помощью реализации org.springframework.data.domain.PageImpl. В вашем случае, после того, как отображение результата в список вы можете сделать следующее:

PageRequest pageable = new PageRequest(0, 2); 
Page<WeightedDecision> page = new PageImpl<>(weightedDecisions, pageable, weightedDecisions.size()); 

Справочной информацией: Насколько я знаю, в данный момент не представляется возможным использовать выгружаемый на пользовательских запросах в SDN (Paging and sorting in Spring Data Neo4j 4). Поэтому вам нужно сделать сопоставление самостоятельно.

Ваш второй вопрос содержит логику подсчета. По-моему, вы должны повторно позвонить по своему запросу с изменениями в зависимости от того, что вы хотите подсчитать. Например, для подсчета childD узлов:

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) WHERE id(parentD) = {decisionId} 
OPTIONAL MATCH (childD)<-[:VOTED_FOR]-(vg:VoteGroup)-[:VOTED_ON]->(c:Criterion) WHERE id(c) IN {criteriaIds} WITH childD, ru, u, vg.avgVotesWeight as weight 
OPTIONAL MATCH (childD)<-[:SET_FOR]->(sortValue375:Value)-[:SET_ON]->(sortCharacteristic375:Characteristic) WHERE id(sortCharacteristic375) = 375 RETURN count(childD) AS result; 
+0

Спасибо за ваш ответ. Можно ли перевести, например, новый PageRequest (0, 1000) в SKIP 0 LIMIT 1000, или я должен сделать некоторую математику в параметрах PageRequest.page, PageRequest.size, прежде чем переводить ее в соответствующие Cypher SKIP и LIMIT? – alexanoid

+0

Это зависит от того, что вы хотите со страницы. Если ваша единственная задача - вернуть страницу вместо списка, тогда было бы нормально использовать пропуск и ограничение в вашем запросе и поместить полные результирующие данные в объект страницы. –

+0

Спасибо за помощь! – alexanoid

Смежные вопросы