Neo4j SDN4 OGM AmbiguousBaseClassException

时间:2017-02-01 08:36:40

标签: neo4j spring-data-neo4j-4 neo4j-ogm

我遇到了一个问题,其中我的一些Neo4J查询(如下所示)最终出现在OGM AmbiguousBaseClassException中,而其他人则不知道。例如,电影中的findByTitle" The Score"抛出一个例外但是" The Matrix"才不是。我的图表由https://neo4j.com/developer/example-data/

处的电影数据库填充

我无法找到对上述观察的解释,我希望有人可以提供帮助。

curl 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 个答案:

答案 0 :(得分:1)

通过删除Actor和Director域类并使用带有Actor列表和控制器列表的Person类解决了这个问题。