2016-06-14 5 views
0

Für mich:Neo4j OGM Neo4jSession Variablensubstitution Abfragen fehl

neo4jSession.query("MATCH (n:Widget) WHERE (n.partNumber STARTS WITH '001') RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT 10", Collections.emptyMap()); 

funktioniert.

Diese Abfrage funktioniert nicht:

String query = "MATCH (n:Widget) " + 
    "WHERE (n.partNumber STARTS WITH {queryString}) " + 
    "RETURN n.partNumber AS id, n.name AS description, n.urn AS urn " + 
    "LIMIT {limit}"; 
Map<String, Object> params = ImmutableMap 
    .<String, Object>builder() 
    .put("queryString", queryString) 
    .put("limit", limit) 
    .build(); 
return (List) neo4jOperations.queryForObjects(Object.class, query, params); 

Es gibt eine leere Liste. Ich habe auch mit meinem tatsächlichen Domain-Objekt versucht:

return (List) neo4jOperations.queryForObjects(Widget.class, query, params); 

mit dem gleichen Ergebnis.

Ich benutze OGM 2.0.2, neo4j 2.3.2 und Spring Data Neo4j 4.1.1 ABER ich habe dies ohne neo4jOperations mit Neo4jSession selbst mit den gleichen Ergebnissen versucht. Oh, ich benutze auch eine Entfernung von neo4j mit dem HTTP-Treiber.

Gibt es einen Fehler in OGM?

MEHR INFO:

über den Draht, glaube ich, die Nachrichten wie folgt aussehen:

{  "statements":[ 
     { 
     "statement":"MATCH (n:Widget) WHERE (n.partNumber STARTS WITH {queryString}) RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT {limit}", 
     "parameters":{ 
      "queryString":"001", 
      "limit":10 
     }, 
     "resultDataContents":[ 
      "graph" 
     ], 
     "includeStats":false 
     } ] } 




{  "statements":[ 
     { 
     "statement":"MATCH (n:Widget) WHERE (n.partNumber STARTS WITH '001') RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT 10", 
     "parameters":{ 

     }, 
     "resultDataContents":[ 
      "rest" 
     ], 
     "includeStats":true 
     } ] } 

NOCH MEHR INFORMATIONEN:

ich dies als beide @QueryResult mit Widget versucht haben und als @NodeEntity (mit Getter und Setter).

@QueryResult 
public class TypeaheadData { 
    public Object id; 
    public String description; 
    public String uid; 
} 

UND

@NodeEntity 
public class TypeaheadData { 
    public Object id; 
    public String description; 
    public String uid; 

    public TypeaheadData() { 
    } 

    public Object getId() { 
    return id; 
    } 

    public void setId(Object id) { 
    this.id = id; 
    } 

    public String getDescription() { 
    return description; 
    } 

    public void setDescription(String description) { 
    this.description = description; 
    } 

    public String getUid() { 
    return uid; 
    } 

    public void setUid(String uid) { 
    this.uid = uid; 
    } 
} 

Ich habe auch die Antwort über den Draht inspiziert und in beiden Fällen sieht es wie folgt aus:

{ 
    "results":[ 
     { 
     "columns":[ 
      "id", 
      "description", 
      "uid" 
     ], 
     "data":[ 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      }, 
      { 
       "graph":{ 
        "nodes":[ 

        ], 
        "relationships":[ 

        ] 
       } 
      } 
     ] 
     } 
    ], 
    "errors":[ 

    ] 
} 

Wenn ich entfernen Sie das Widget @NodeEntity, diese wird die Anfrage gesendet:

{ 
    "statements":[ 
     { 
     "statement":"MATCH (n:Widget) WHERE (n.partNumber STARTS WITH {queryString}) RETURN n.partNumber AS id, n.name AS description, n.urn AS urn LIMIT {limit}", 
     "parameters":{ 
      "queryString":"001", 
      "limit":10 
     }, 
     "resultDataContents":[ 
      "row" 
     ], 
     "includeStats":false 
     } 
    ] 
} 

und das Widget @NodeEntity entfernt wurde, wird die Antwort, die richtigen Daten in ihm haben, aber der Mapper wirft:

Scalar Antwort-Abfragen eine Spalte zurückgeben nur müssen. Stellen Sie sicher, dass Ihre -Abfrage nur ein Element zurückgibt.

Antwort

2

Der OGM kann keine Auflistung von Eigenschaften in einer Domänenentität zuordnen. Ihre Anfrage zurück:

RETURN n.partNumber AS id, n.name AS description, n.urn AS urn 

aber es gibt nichts, was die OGM zu sagen, welche Art von Unternehmen ist dies, wenn es überhaupt eine ist.

dies RETURN n ändern sollte mit neo4jOperations.queryForObjects(Widget.class, query, params);

+0

queryForObject ist nicht die Methode, die Sie mit zufälligen Knoteneigenschaften verwenden sollten. Ich habe das Problem, das Sie gemeldet haben, auch https://github.com/neo4j/neo4j-ogm/issues/184 kommentiert – Luanne

1

Neo4j OGM die Arbeit erledigen kann nicht Mapping Anfragen bearbeiten, die nicht ganze Knoten Objekte zurückgeben kann. Wenn Sie in einer Abfrage nur eine Teilmenge der Eigenschaften eines Knotens anfordern, müssen Sie die Abfragemethode verwenden, die ein Ergebnis zurückgibt. Und dann musst du das Mapping selbst machen.

Wenn Sie spring-data-neo4j verwenden, können Sie die Annotation @QueryResult zusammen mit einem Repository @Query verwenden, um das Mapping für Sie zu bearbeiten. Wenn Sie sich den Code ansehen, haben sie einen Mapper aus den Metadaten der Neo4jSession abgeleitet.

Die einzige Ausnahme ist, wenn Sie für einzelne Eigenschaften auf Knoten abfragen, dann funktioniert die Funktion queryForObjects.

Seem ist wie ein Versehen für mich, aber wen soll ich sagen.

Verwandte Themen