2017-02-01 16 views
0

次のようなNeo4Jクエリの中には、OGM AmbiguousBaseClassExceptionで終了する問題があります。たとえば、映画「The Score」のfindByTitleは例外をスローしますが、「The Matrix」は例外ではありません。私のグラフにムービーデータベースがあります。https://neo4j.com/developer/example-data/Neo4j SDN4 OGM AmbiguousBaseClassException

上記の説明には説明がありません。誰かが助けてくれることを願っています。

カールhttp://localhost:8080/movies/search/findByTitle?title=The%20Score

のNeo4jサーバ:3.1.0

春データのNeo4j:4.1.1

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.neo4j.ogm.exception.MappingException: Error mapping GraphModel to instance of com.knowledgeGraph.kgClient.domain.Movie 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.0.28.jar:8.0.28] 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.0.28.jar:8.0.28] 

Caused by: org.neo4j.ogm.exception.AmbiguousBaseClassException: Multiple classes found in type hierarchy that map to: [Person, Actor, Director] 
at org.neo4j.ogm.MetaData.resolve(MetaData.java:174) ~[neo4j-ogm-core-2.0.1.jar:na] 
at org.neo4j.ogm.annotations.EntityFactory.resolve(EntityFactory.java:121) ~[neo4j-ogm-core-2.0.1.jar:na] 
at org.neo4j.ogm.annotations.EntityFactory.instantiateObjectFromTaxa(EntityFactory.java:105) ~[neo4j-ogm-core-2.0.1.jar:na] 
at org.neo4j.ogm.annotations.EntityFactory.newObject(EntityFactory.java:61) ~[neo4j-ogm-core-2.0.1.jar:na] 

ドメインオブジェクト:

作品クラス:

import static org.neo4j.graphdb.Direction.INCOMING; 
import org.neo4j.ogm.annotation.GraphId; 
import org.neo4j.ogm.annotation.NodeEntity; 
import org.neo4j.ogm.annotation.Relationship; 

import com.fasterxml.jackson.annotation.JsonIdentityInfo; 
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.voodoodyne.jackson.jsog.JSOGGenerator; 

@JsonIdentityInfo(generator=JSOGGenerator.class) 
@NodeEntity 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Movie { 

@GraphId Long nodeId; 
String id; 
String title; 
String description; 

@Relationship(type="DIRECTED", direction = Relationship.INCOMING) 
List<Person> directors; 

@Relationship(type="ACTS_IN", direction = Relationship.INCOMING) 
List<Person> actors; 

private String language; 
private String imdbId; 
private String tagline; 
private String releaseDate; 
private Integer runtime; 
private String homepage; 
private String trailer; 
private String genre; 
private String studio; 
private Integer version; 
private String lastModified; 
private String imageUrl; 

public Movie() { } 

public String getId() { 
    return id; 
} 
public void setId(String id) { 
    this.id = id; 
} 

/*Remaining Set's and Get's*/ 

} 

のクラス:

import org.neo4j.ogm.annotation.GraphId; 
import org.neo4j.ogm.annotation.NodeEntity; 
import com.fasterxml.jackson.annotation.JsonSubTypes; 

@NodeEntity 
@JsonSubTypes({ 
@JsonSubTypes.Type(value = Actor.class, name = "actor"), 
@JsonSubTypes.Type(value = Director.class, name = "director") 
}) 

public class Person { 

    @GraphId Long nodeId; 
    String id; 
    String name; 
    private String birthday; 
    private String birthplace; 
    private String biography; 
    private Integer version; 
    private String lastModified; 
    private String profileImageUrl; 

    public Person() {} 

    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 

    /*Remaining Set's and Get's*/ 

} 

ディレクタークラス:

@NodeEntity 
public class Director extends Person{ 

@GraphId 
Long id; 

public Director() { 
} 

@Relationship(type="DIRECTED", direction = Relationship.OUTGOING) 
private List<Movie> directedMovies = new ArrayList<Movie>(); 

public List<Movie> getDirectedMovies() { 
    return directedMovies; 
} 

public void setDirectedMovies(List<Movie> directedMovies) { 
    this.directedMovies = directedMovies; 
} 

} 

俳優クラス:

@NodeEntity 
public class Actor extends Person { 

@GraphId 
Long id; 

public Actor() { 
} 

@Relationship(type="ACTS_IN", direction = Relationship.OUTGOING) 
private List<Movie> actedMovies = new ArrayList<Movie>(); 

public List<Movie> getMovies() { 
    return actedMovies; 
} 

public void setMovies(List<Movie> movies) { 
    this.actedMovies = movies; 
} 
} 

リポジトリ:

俳優と監督のドメインクラスを削除することによってこの問題を解決
public interface ActorRepository extends GraphRepository<Actor>{ 

    @Query("MATCH (a:Actor) -[:ACTS_IN]-> (m:Movie {`title`:{title}}) return a") 
    Collection<Actor> findActorsOfMovie(@Param("title") String title); 
} 


public interface DirectorRepository extends GraphRepository<Director>{ 

    @Query("MATCH (d:Director) -[:DIRECTED]-> (m:Movie {`title`:{title}}) return d") 
    Collection<Director> findDirectorOfMovie(@Param("title") String title); 

} 

public interface MovieRepository extends GraphRepository<Movie>{ 

    Movie findByTitle(@Param("title") String title); 

    @Query("MATCH (m:Movie) WHERE m.title =~ ('(?i).*'+{title}+'.*') RETURN m") 
    Collection<Movie> findByTitleContaining(@Param("title") String title); 
} 

public interface PersonRepository extends GraphRepository<Person>{ 

    @Query("MATCH (a:Person) -[:ACTS_IN]-> (m:Movie {`title`:{title}}) return a") 
    Set<Person> findActorsOfMovie(@Param("title") String title); 

    @Query("MATCH (d:Person) -[:DIRECTED]-> (m:Movie {`title`:{title}}) return d") 
    Set<Person> findDirectorOfMovie(@Param("title") String title); 
} 

答えて

1

ActorリストとDirectorリストを持つPersonクラスを使用しました。

関連する問題