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.
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