Как получить связь между двумя узлами с помощью Neo4j с загрузкой Spring GraphRepository?

Я новичок в Neo4j, и у меня есть базовое представление о графической модели neo4j. Я хотел бы знать, как получить связь между двумя узлами с помощью java и cyper запроса. У меня есть две сущности, такие как следующие пользователи и роли. Я хочу получить роль пользователя. У меня есть cyper-запрос, который работает нормально. Когда я пробовал использовать классы сущностей neo4j, мне чего-то не хватало. Взгляните на приведенный ниже фрагмент кода,

Класс сущности пользователя:

public class Users extends Entity{

    /*private Long userId;*/
    private String name;
    private String email;
    private String login;
    private String password;

    @Relationship(type = "HAS_ROLE")
    Set<Roles> roles=new HashSet<Roles>();

    public Users(){
        roles = new HashSet<Roles>();
    }

    public Users(Users user) {
        super();
        this.name = user.getName();
        this.login = user.getLogin();
        this.password = user.getPassword();
        this.roles = user.getRoles();
    }

    public Set<Roles> getRoles() {
        return roles;
    }

    public void setRoles(Set<Roles> roles) {
        this.roles = roles;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Класс сущности ролей:

public class Roles extends Entity implements GrantedAuthority{

    private static final long serialVersionUID = 1L;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getAuthority() {
        return name;
    }
}



 public interface UserRepository extends GraphRepository<Users> {

     @Query("MATCH (user:Users)-[r]->(role:Roles) WHERE user.login = {0} RETURN user, role");  
     Users findByLogin(String login);

   }

Может ли кто-нибудь помочь мне узнать, как получить роли против пользователя?

TIA ..,


person DIVA    schedule 31.08.2015    source источник
comment
Когда вы говорите, что пробовали через классы сущностей, что вы пробовали? Загрузки пользователя должно быть достаточно для получения связанных ролей.   -  person Luanne    schedule 31.08.2015
comment
@Luanne Я попытался получить роль против пользователя, но она вернула нулевое значение. Когда я попробовал пользователя с ролью. Я мог успешно составить карту отношений. Я просто хочу знать, как получить информацию о пользователе и его роль в отношении этого пользователя.   -  person DIVA    schedule 01.09.2015
comment
@Luanne Это cyper-запрос, который я использую MATCH (user: Users) - [] - (role: Roles) WHERE user.login = test RETURN user.name, user.login, user.password, role.name. Он работает, когда я пробовал через браузер neo4j. Но это не работает, пока я использую классы сущностей для neo4j   -  person DIVA    schedule 01.09.2015
comment
Извините, но я не могу сказать, делаете ли вы @Query, или repository.find, или template.load. Не могли бы вы отредактировать свой ответ, включив в него этот код?   -  person Luanne    schedule 01.09.2015
comment
@Luanne Теперь он работает. Я обновил свой вопрос для вашего ответа.   -  person DIVA    schedule 01.09.2015


Ответы (2)


Производные средства поиска работают с глубина 1 , чтобы ты мог сделать

 public interface UserRepository extends GraphRepository<Users> {
   Users findByLogin(String login);
 }

Если вы хотите использовать @Query, верните путь (и при необходимости отрегулируйте глубину). Этот пример аналогичен приведенному выше - depth = 1

public interface UserRepository extends GraphRepository<Users> {
   @Query("MATCH p=(user:Users)-[r*0..1]->() WHERE user.login = {0} RETURN p") 
   Users findByLogin(String login);
 }
person Luanne    schedule 01.09.2015
comment
Спасибо за ваш ответ - person DIVA; 01.09.2015

Важно знать, что для получения узла с помощью cypher и java вы должны включить связь между первым узлом и нулевым значением в предложении RETURN:

@Query("MATCH (u:User)<-[rel:RELATIONSHIP]-(r:Roles) " +
            " RETURN u,r,rel")
    Users findByLogin(String login);

Без этого свойство Stay в ссылке будет иметь нулевое значение.

person Xavi Torrens    schedule 10.05.2016