2016-06-14 81 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自己尝试了这一点,结果相同。哦,我还用HTTP驱动程序去除了neo4j的实例。

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 AND作为@NodeEntity(w/getters和setters)。

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

    ] 
} 

如果我删除了Widget @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,响应确实有它正确的数据,但映射抛出:

标响应查询必须只返回一列。确保您的密码查询 只返回一个项目。

回答

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不能处理映射查询不返回整个节点对象。如果您在查询中仅请求节点属性的子集,则必须使用返回Result的查询方法。然后你必须自己做映射。

如果您使用的是spring-data-neo4j,那么您可以使用他们的@QueryResult注释与一个存储库@Query混合来处理您的映射。如果你看看代码,他们已经从Neo4jSession提供的元数据中找出了一个映射器。

一个例外是,如果您查询节点上的单个属性,那么queryForObjects函数将工作。

看起来像是对我的疏忽,但是我是谁。