2016-07-14 3 views
1

При кодировании 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)); 
+0

Вы должны включить соответствующую часть кода в свой вопрос. В конце концов внешние ссылки стали недоступными и не позволяли потенциальным пользователям получать выгоду от вашего поста. – Andrej

+0

Добавлено, спасибо за предложение – artemisian

ответ

1

ниже ответа от команды Neo4j о issue:

Th е причина сущность отношения не могут быть отображены, потому что начальный и конечный узел недоступны с этим запросом:

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

Вы должны вернуть эти узлы, чтобы иметь возможность построить правильный отношения субъекта, например:

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

Это побочный эффект конечной точки HTTP, которая позволяет этому передавать: начальный и конечный узлы возвращаются этой конечной точкой в ​​любом случае. Для получения дополнительной информации см. http://graphaware.com/neo4j/2016/04/06/mapping-query-entities-sdn.html .

Смежные вопросы