2016-06-14 3 views
0

Для меня:Neo4j OGM Neo4jSession переменная замещения запросы не

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()); 

работы.

Этот запрос не работает:

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

возвращает пустой список. Я также пробовал с моим фактическим доменным объектом:

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

с таким же результатом.

Я использую OGM 2.0.2, neo4j 2.3.2 и Spring Data Neo4j 4.1.1, но я пробовал это без neo4jOperations, используя Neo4jSession сам с теми же результатами. О, также я использую экземпляр удаления neo4j с драйвером HTTP.

Есть ли ошибка в OGM?

ДОПОЛНИТЕЛЬНО:

За проволокой, ВЕРЮ сообщения выглядеть следующим образом:

{  "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 
     } ] } 

ДАЖЕ Дополнительная информация:

Я попытался это с Widget и как @QueryResult И как @NodeEntity (w/getters и seters).

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

И

@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; 
    } 
} 

Я также проверил реакцию на провод, и в обоих случаях это выглядит следующим образом:

{ 
    "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":[ 

    ] 
} 

Если удалить виджет @NodeEntity, это отправленный запрос:

{ 
    "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 
     } 
    ] 
} 

И убрав Widget @NodeEntity, ответ ДЕЛАЕТ имеет правильные данные в нем, но картографа бросков:

Скалярных запросы ответа должны возвращать только один столбец. Убедитесь, что запрос cypher возвращает только один элемент.

ответ

2

OGM не может отображать коллекцию свойств в объект домена. Ваш запрос возвращает:

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

но нет ничего, чтобы сказать OGM, какого рода сущности это есть, если один на всех.

Изменение этого RETURN n должны сделать работу с neo4jOperations.queryForObjects(Widget.class, query, params);

+0

queryForObject - это не метод, который вы должны использовать со случайными свойствами узла. Я прокомментировал проблему, о которой вы сообщили, а также https://github.com/neo4j/neo4j-ogm/issues/184 – Luanne

1

Neo4j OGM не может обрабатывать картографические запросы, которые не возвращают целые объекты узла. Если вы запрашиваете только подмножество свойств узла в запросе, вы должны использовать метод запроса, который возвращает результат. И тогда вы должны сами сделать картографирование.

Если вы используете spring-data-neo4j, вы можете использовать их аннотацию @QueryResult, смешанную с репозиторием @Query, для обработки отображения для вас. Если вы посмотрите на код, они отменили отображение из метаданных, предоставленных Neo4jSession.

Единственное исключение - если вы запрашиваете отдельные свойства на узлах, то функция queryForObjects будет работать.

Кажется, что это недосмотр, но кто я такой, чтобы сказать.