При кодировании poc с Spring Neo4j с использованием весенней загрузки я столкнулся с тем, что это противоречивое поведение между драйвером Bolt и драйвером Http. В основном после сохранения богатых отношений между двумя узлами тест не может загрузить его при использовании драйвера Bolt, однако тот же самый тест успешно выполняется при использовании драйвера Http.Spring Neo4j - драйвер Bolt не загружает отношения, пока драйвер Http успешно завершает работу
Пример проекта можно загрузить с github
Это очень простой/прямой тест, только необходимым условием является то, что вам нужно будет иметь Neo4j 3 установлен с разъемом Болт включен.
Как полагает Андрей, пожалуйста, найти ниже в соответствующих разделах кода:
@NodeEntity(label = "Person")
public class Person {
private Long id;
private String firstname;
private String lastname;
@Relationship(type = "HAS_CONTACT", direction = Relationship.INCOMING)
private Contact contact;
// getters and setters here .........
}
@NodeEntity(label = "BankAccount")
public class BankAccount {
private Long id;
private Integer balance;
@Relationship(type = "HAS_CONTACT")
private List<Contact> contacts = new ArrayList<>();
// getters and setters here .........
}
@RelationshipEntity(type = "HAS_CONTACT")
public class Contact {
public Contact() {
}
public Contact(BankAccount bankAccount, Person person) {
this.bankAccount = bankAccount;
this.person = person;
this.bankAccount.getContacts().add(this);
this.person.setContact(this);
}
private Long id;
@StartNode
private BankAccount bankAccount;
@EndNode
private Person person;
private String email;
private String phoneNumber;
// getters and setters here .........
}
@Repository
public interface ContactRepository extends GraphRepository<Contact> {
@Query("MATCH (a:BankAccount)-[r:HAS_CONTACT]->(:Person) " +
"WHERE ID(a)={accountId} " +
"RETURN r")
Iterable<Contact> findByAccountId(@Param("accountId") Long accountId);
}
После сохранения 1 счет, 1 человек и 1 контакт отношения между ними ниже запроса является тот, который не удается:
Iterable<Contact> contacts = contactRepository.findByAccountId(accountId);
// this assertion will Fail for the BOLT driver, however, it will Succeed for the HTTP driver
// if the accountRepository.findOne(accountId) statement is executed before calling
// contactRepository.findByAccountId(accountId) then the test will also succeed for the BOLT driver
assertThat(size(contacts), is(1));
Вы должны включить соответствующую часть кода в свой вопрос. В конце концов внешние ссылки стали недоступными и не позволяли потенциальным пользователям получать выгоду от вашего поста. – Andrej
Добавлено, спасибо за предложение – artemisian