Фильтр по полю отношений - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь получить все сущности для совпадения полей данного отношения (я хочу, чтобы отношения моего лица были заполнены в результате).Попытка с помощью Filter в session.loadAll () отфильтровать поле отношения, но я не могу заставить его работать.

Определение моего объекта выглядит так:

@NodeEntity    
class ClockAction {
 @Id @GeneratedValue
 private Long id;
 private String description
 private User user;
 private Office office;
}

@NodeEntity    
class User {
 @Id @GeneratedValue
 private Long id;
 private String name;
 private List<ClockAction> clockActions;
}

@NodeEntity    
class Office {
 @Id @GeneratedValue
 private Long id;
 private String name;
 private List<ClockAction> clockActions;
}

Исходя из этого янужно получить все объекты ClockAction, где User.id находится в заданном наборе идентификаторов.

Вот моя попытка:

Filter filter = Filter("id", ComparisonOperator.IN, userIds);
filter.setNestedPropertyName("user");
filter.setNestedPropertyType(User.class);
filter.setNestedRelationshipEntity(true);

return session.loadAll(ClockAction.class, filter);

Это всегда возвращает пустой результат.Любая идея о том, что я делаю неправильно?

Использование подобного запроса session.query

session.query(ClockAction.class, "MATCH p=(a:ClockAction)-[r]-() WHERE id(r) IN {ids} RETURN nodes(p), rels(p), a, r ORDER BY a.id", params) 

работает, но в результирующем объекте заполняется только служебное поле ClockAction, пользователь всегдаnull ...

Любая помощь приветствуется:)

Ответы [ 2 ]

0 голосов
/ 18 июля 2018

В итоге я следовал советам @meistermeier и комментировал мои отношения, давая указания.

Ниже приведены мои модели сущностей:

@NodeEntity    
class ClockAction {
 @Id @GeneratedValue
 private Long id;
 private String description
 @Relationship(direction = Relationship.OUTGOING)
 private User user;
 @Relationship(direction = Relationship.OUTGOING)
 private Office office;
}

@NodeEntity    
class User {
 @Id @GeneratedValue
 private Long id;
 private String name;
 @Relationship(direction = Relationship.INCOMING)
 private List<ClockAction> clockActions;
}

@NodeEntity    
class Office {
 @Id @GeneratedValue
 private Long id;
 private String name;
 @Relationship(direction = Relationship.INCOMING)
 private List<ClockAction> clockActions;
}

То, что @meistermeier предложил для запроса, не сработало для меня, но вдохновило меня, и я обнаружил, что это прекрасно работает:

MATCH p((u:User)-[ur]-(c:ClockAction)-[or]-()) WHERE id(u) IN {ids} RETURN p, rels(p)
0 голосов
/ 06 июля 2018

Сначала кое-что:

  1. К сожалению, в настоящее время невозможно выполнить фильтрацию для поля id, поскольку фильтры работают только со свойствами. Идентификационные поля запрашиваются в шифре с помощью функции id. (id(n)! = n.id)

  2. Вы не ищете объект отношения (удалить filter.setNestedRelationshipEntity(true);)

Теперь у вас есть выбор:

  1. Запросить другое свойство класса User с фильтром.

  2. Измените свой запрос на шифрование примерно так: "MATCH p=(a:ClockAction)-[r]-(n) WHERE id(n) IN {ids} RETURN nodes(p), rels(p), a, r ORDER BY a.id" Изменения основаны на предположении, что фрагменты кода верны и User не является отношением.

Дополнительная информация (редактировать): Если отношения не определены, Neo4j OGM создаст их, направляя исходящие с сохраняемого узла Ваш график может выглядеть следующим образом (ClockAction от имени root):

Graph example

Или вот так (пользователь с правами root с несколькими ClockActions):

Graph example 2

Вы не получаете Office, поскольку текущий путь запроса (:User)-[r]-(:ClockAction), в пути нет информации о Office.

MATCH (n:User)-[ur:CLOCK_ACTIONS]->(c:ClockAction)-[or:OFFICE]->(o:Office) WHERE id(n) IN {ids} RETURN c, n, ur, o, or - довольно простой запрос, который вы можете использовать. Он удаляет стиль, ориентированный на путь, но также загружает все необходимые данные. Если график был сохранен с помощью User, но это только пример, и его можно применять, как бы данные ни выглядели на вашем графике, вы не увидите никакой информации User на ClockAction с, поскольку, поскольку она сохраняется без каких-либо Подсказка Neo4j OGM также ожидает данные, относящиеся в исходящем направлении от класса, который вы хотите загрузить. Теперь необходимо, следуя примеру User, добавить @Relationship(type="CLOCK_ACTION", direction = "INCOMING") в поле user в своем классе ClockAction. Это даст Neo4j OGM необходимую подсказку для помещения данных User в поле user.

...