我遇到了一个问题,其中我的一些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);
}
答案 0 :(得分:1)
通过删除Actor和Director域类并使用带有Actor列表和控制器列表的Person类解决了这个问题。