1

在过去的几天里,我正在尝试使用 Neo4j 嵌入式数据库进行演示,并且对用于索引、Lucene 查询甚至设法进行模糊搜索的 Native Java API 印象深刻。然后我决定使用 Spring Data Neo4j 4.0 将此 POC 投入生产,但遇到了 Cypher 查询和模糊搜索的问题。

我的域类“团队”如下所示:

@NodeEntity public class Team {

@GraphId Long nodeId;

/** The team name. */
@Indexed(indexType = IndexType.FULLTEXT,indexName = "teamName")
private String teamName;

public Team(){};

public Team(String name){
    this.teamName = name;
}

public void setTeamName(String name){
    this.teamName = name;
}

public String getTeamName(){
    return this.teamName;
}
}

我正在按如下方式填充我的数据库:

Team lakers = new Team("Los Angeles Lakers");
Team clippers = new Team("Los Angeles Clippers of Anaheim");
Team warriors = new Team("Golden State Warriors");
Team slappers = new Team("Los Angeles Slappers of Anaheim");
Team slippers = new Team("Los Angeles Slippers of Anaheim");

    Transaction tx = graphDatabase.beginTx();
    try{

        teamRepository.save(lakers);
        teamRepository.save(clippers);
        teamRepository.save(warriors);
        teamRepository.save(slappers);
        teamRepository.save(slippers);
    }

我的 TeamRepository 界面如下所示:

public interface TeamRepository extends CrudRepository<Team, String>
{
    @Query("MATCH (team:Team) WHERE team.teamName=~{0} RETURN team")
    List<Team> findByTeamName(String query);

}

我的查询看起来像:

List<Team> teams = teamRepository.findByTeamName("The Los Angeles Will be Playing in a state of Golden");

上面的 CYPHER 查询不返回任何内容。

我希望能够在 Spring 中执行如下所示的 Native Java API 类型查询并获得以下结果。(teamIndex 是我在团队名称上创建的全文搜索索引)

IndexHits<Node> found = teamIndex.query("Team-Names",queryString+"~0.5");.

发现原生 JAVA API:

  • 洛杉矶湖人队
  • 阿纳海姆洛杉矶快船队
  • 金州勇士队
  • 洛杉矶阿纳海姆拍板
  • 阿纳海姆的洛杉矶拖鞋
4

1 回答 1

1

您正在寻找的是 SDN3

SDN4 不支持@Indexed。

有一个带有一些额外查询方法的 IndexRepository,但您也可以像这样使用密码:

public interface TeamRepository extends GraphRepository<Team>
{
    @Query("start team=node:teamName({0}) RETURN team")
    List<Team> findByTeamName(String query);
}

这会将索引查询发送到 Lucene。

于 2015-07-11T00:41:39.893 回答