2016-07-14 8 views
1

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)); 
+0

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

+0

Hinzugefügt, danke für den Vorschlag – artemisian

Antwort

1

Siehe unten die Antwort von dem Neo4j Team über die issue:

Th e Grund kann die Beziehung Entität werden nicht abgebildet, da die Start- und End-Knoten mit dieser Abfrage nicht verfügbar sind:

@Query("MATCH (a:BankAccount)-[r:HAS_CONTACT]->(p:Person) " + 
      "WHERE ID(a)={accountId} " + 
      "RETURN r,") 
    Iterable<Contact> findByAccountId(@Param("accountId") Long accountId); 

Sie müssen diese Knoten zurückkehren zu können, eine gültige Beziehung Einheit konstruieren, wie folgt aus:

@Query("MATCH (a:BankAccount)-[r:HAS_CONTACT]->(p:Person) " + 
      "WHERE ID(a)={accountId} " + 
      "RETURN r,a,p") 
    Iterable<Contact> findByAccountId(@Param("accountId") Long accountId); 

Es ist ein Nebeneffekt des HTTP-Endpunkts, der es ermöglicht, dass der Start- und Endknoten von diesem Endpunkt zurückgegeben wird. Weitere Informationen finden Sie unter http://graphaware.com/neo4j/2016/04/06/mapping-query-entities-sdn.html .

Verwandte Themen