Neo4j: loadByProperty загружает другие объекты, не принадлежащие узлу

моя структура выглядит следующим образом:

компания -> наличие набора пользователей -> у каждого пользователя есть набор политик -> каждая политика предназначена для компании.

примерная структура графа:

       u1 <- c1 -> u2 
       p1 -> c1
       u1 -> p1 

Компания (c1) имеет двух пользователей (u1, u2), а политика (p1) принадлежит компании (c1). «u1» принял политику (p1). "u2" не имеет политики.

Когда я пытаюсь загрузить u2 методом loadByProperty, ожидаемым должен быть объект User2 и соответствующая компания (c1).

Но политика (p1) также загружается и устанавливается в объект «u2».

Структура класса;

Company{
   Stirng companyName;
   @Relationship(type = "hasUsers", direction = Relationship.OUTGOING)
   List<User> users;
}

User{
   Stirng userName;
   @Relationship(type = "hasPolicy", direction = Relationship.OUTGOING)
   List<Policy> policies;
}

Policy{
   String policyName;
   @Relationship(type = "forCompany", direction = Relationship.OUTGOING)
   Company company;
}

Способ получения пользователя:

 public User getUser(String userName) { 
    Property<String, Object> properties = new Property<String, Object("userName", userName); 
    Set<User> users = (Set<User>) session.loadByProperty(User.class, properties); 
    if (users != null && !users.isEmpty()) 
        for (User user : users) 
            return user; 
   return null; 
 }

Использование SDN 4 (версия вехи).

Какие-либо предложения? Спасибо заранее.


person madireddy    schedule 17.08.2015    source источник
comment
Пожалуйста, поделитесь кодом   -  person Luanne    schedule 17.08.2015
comment
public User getUser(String userName) { Property‹String, Object› properties = new Property‹String, Object›(userName, userName); Set‹User› users = (Set‹User›) session.loadByProperty(User.class, properties); if (users != null && !users.isEmpty()) for (User user : users) return user; вернуть ноль; }   -  person madireddy    schedule 17.08.2015
comment
Также поделитесь классами User/Company/Policy   -  person Luanne    schedule 17.08.2015
comment
обновленное описание. См. выше   -  person madireddy    schedule 17.08.2015
comment
Невозможно воспроизвести это с помощью общего кода. Зарегистрируйте проблему на jira.spring.io с тестом. Пожалуйста, обновитесь до версии 4.0.0.RC1. Свойство больше недоступно, теперь оно называется «Фильтр».   -  person Luanne    schedule 17.08.2015
comment
Спасибо... я обновлюсь до 4.0.0.RC1 и свяжусь с вами.   -  person madireddy    schedule 18.08.2015
comment
Не могли бы вы дать обзор свойства/фильтра.   -  person madireddy    schedule 18.08.2015
comment
У вас все еще есть проблемы с этим? Пожалуйста, посмотрите мой ответ   -  person Luanne    schedule 20.08.2015


Ответы (1)


Существует несколько способов загрузки объекта по значению свойства.

Нео4jОперации

Используйте loadByProperty или loadAllByProperty

Производные средства поиска (только репозитории)

@Repository
public interface UserRepository extends GraphRepository<User> {

User findByName(String name); 

}

SDN будет использовать информацию метаданных, чтобы преобразовать ее в запрос Cypher.

@Query (только репозитории)

@Repository
public interface UserRepository extends GraphRepository<User> {

   @Query("MATCH (user:User{name:{0}}) RETURN user")
   User findUserByName(String name);

}

Сеанс

Используйте любой из loadAll методов, которые принимают Filter. Пример:

session.loadAll(Person.class, new Filter("firstName", "John"))
person Luanne    schedule 20.08.2015