2016-04-02 6 views
0

Ich habe Einheit, die wie folgt aussieht:In SDN4 gibt neo4jOperations.queryForObjects Entitäten mit leeren Auflistungen zurück. Wie löst man?

@NodeEntity 
class User { 
    String name; 
    boolean male; 
    <...> 
    @Relationship(type = "friend") 
    Set<User> friends; 
    @Relationship(type = "participation") 
    Set<Event> events; 
    <...> 
} 

Um männliche Nutzer ich den folgenden Code verwenden, um abzufragen:

String q = "MATCH (u:User) WHERE u.male=true RETURN u"; 
Iterable<User> maleUsers = neo4jOperations.queryForObjects(User.class, q, emptyMap()); 

Aber es gibt Benutzer mit leeren Sammlungen von Freunden und Veranstaltungen.

Der Versuch, das Problem, das ich habe den folgenden Code zu beheben:

String q = "MATCH (u:User) WHERE u.male=true WITH u MATCH p=(u)-[*0..1]-() RETURN p"; 
Iterable<User> maleUsers = neo4jOperations.queryForObjects(User.class, q, emptyMap()); 

Und jetzt Sammlungen initialisiert werden. Aber diese Änderung bringt ein neues Problem:

  • Dieser Code sollte zurückkehren: nur männliche Nutzer
  • Aber in der Tat gibt es: männlich Benutzer und Benutzer, irgendwie im Zusammenhang mit männlichen Benutzern

Wie um mein Problem richtig zu lösen? Irgendwelche Gedanken werden sehr geschätzt!

PS: Ich benutze Spring Data Neo4j 4.1.0.M1.

Antwort

1

Dies liegt daran, dass Sie einen Pfad zurückgeben, der viele User-Entitäten enthält, und die OGM kann nicht angeben, welche Sie zurück wollen. Der beste Weg, dies zu tun, wäre session.query zu verwenden:

Result result = session.query("MATCH (u:User) WHERE u.male=true WITH u MATCH p=(u)-[*0..1]-() RETURN u as user, nodes(p),rels(p)",emptyMap()); 

und dann von result, Abrufen jedes user die abgebildeten Freunde und Ereignisse haben.

+0

Danke für Ihre Antwort! Scheint wie eine gute Idee. Aber es funktioniert nicht für mich, da ich einen Knoten ohne Label habe (eigentlich ist es ein Neo4j Spatial Root Node). Aufgrund dessen existiere ich NPE in der RestModelMapper-Datei. Die Zeile # 153 enthält den folgenden Ausdruck: 'metaData.resolve (nodeModel.getLabels()). GetUnderlyingClass()', wobei 'nodeModel.getLabels()' ein leeres Array für den oben erwähnten Knoten zurückgibt. Dies führt dazu, dass 'metaData.resolve (nodeModel.getLabels())' null zurückgibt. Und es scheitert ... Was kann ich damit machen? –

+1

Leider ist dies ein Bug- Ich habe https://github.com/neo4j/neo4j-ogm/issues/150 für Sie geöffnet, um es zu verfolgen, und es wird so schnell wie möglich behoben werden. Danke, dass du es gemeldet hast. – Luanne

+0

Vielen Dank für die Bemühungen! Ich werde das Problem verfolgen. –