Beim Codieren eines Poc mit Spring Neo4j mit Spring Boot stieß ich auf ein inkonsistentes Verhalten zwischen dem Bolt-Treiber und dem Http-Treiber. Grundsätzlich kann nach dem Speichern einer reichen Beziehung zwischen zwei Knoten der Test nicht geladen werden, wenn der Bolt-Treiber verwendet wird, jedoch ist derselbe Test beim Versuch mit dem Http-Treiber erfolgreich.Spring Neo4j - Schraubenzieher lädt keine Beziehung, während der Http-Treiber erfolgreich
Das Beispielprojekt kann von github
heruntergeladen wird Es ist ein sehr einfacher/straight forward-Test, die einzige Voraussetzung ist, dass Sie aktiviert Neo4j 3 installiert mit dem Bolt-Anschluss haben muß.
Wie Andrej vorgeschlagen bitte unter den entsprechenden Abschnitten des Codes finden:
@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);
}
Nach dem Speichern 1 Konto, 1 Person und 1 Kontaktbeziehung zwischen ihnen der folgenden Abfrage ist derjenige, der fehlschlägt:
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));
Sie sollten den relevanten Teil des Codes in Ihre Frage aufnehmen. Schließlich wurden externe Links nicht mehr verfügbar und verhindern, dass potenzielle Nutzer von Ihrem Beitrag profitieren. – Andrej
Hinzugefügt, danke für den Vorschlag – artemisian