我们假设我们使用这个简单的图模型:
@NodeEntity
class Ad {
// GraphId and more Ad attributes...
@Relationship(type = "HAS_ADVERTISER", direction = Relationship.OUTGOING)
private User advertiser;
@Relationship(type = "IS_FAVOURITE_TO", direction = Relationship.OUTGOING)
private Set<User> favourites = new HashSet<>();
// Getters and setters
}
编辑:按照其中一个aswers的建议,我尝试将传入的关系添加到用户实体,但问题仍然存在.
@NodeEntity
class User {
// User attributes. No incoming relationships for HAS_ADVERTISER neither IS_FAVOURITE_TO...
// EDIT: Added incoming relationships to User entity, but the problem still remains. Tried annotating getters/setters, but neither works
@Relationship(type = "HAS_ADVERTISER", direction = Relationship.INCOMING)
private Set<Ad> ads = new HashSet<>();
@Relationship(type = "IS_FAVOURITE_TO", direction = Relationship.INCOMING)
private Set<Ad> favourites = new HashSet<>();
@Relationship(direction = Relationship.INCOMING)
public Set<Ad> getAds() {
return ads;
}
@Relationship(direction = Relationship.INCOMING)
public void setAds(Set<Ad> ads) {
this.ads = ads;
}
@Relationship(direction = Relationship.INCOMING)
public Set<Ad> getFavourites() {
return favourites;
}
@Relationship(direction = Relationship.INCOMING)
public void setFavourites(Set<Ad> favourites) {
this.favourites = favourites;
}
}
如果我通过neo4j控制台执行密码查询以检索包含广告客户和收藏夹信息的广告,那么它运行良好:
MATCH (ad:Ad),
(ad)-[has_advertiser:HAS_ADVERTISER]->(advertiser:User),
(ad)-[is_favourite_to: IS_FAVOURITE_TO] -> (favouriteUser:User)
return ad, has_advertiser, advertiser, is_favourite_to, favouriteUser
但是,如果我通过neo4jRepository执行查询:
>广告客户用户已正确保留.
>收藏夹集中有两个用户:广告客户用户总是被添加到集合中,这是不正确的,因为与该用户没有IS_FAVOURITE_TO关系.
@Repository
public interface AdRepository extends Neo4jRepository<Ad> {
@Query("MATCH (ad:Ad)," +
"(ad)-[has_advertiser:HAS_ADVERTISER]->(advertiser:User)," +
"(ad)-[is_favourite_to: IS_FAVOURITE_TO] -> (favouriteUser:User)" +
"return ad, has_advertiser, advertiser, " +
"is_favourite_to, favouriteUser ")
List<Ad> findAds();
}
我可以在查询或图形模型中更改某些内容以避免这种情况吗?
也许是spring-data-neo4j的bug?
版本:
<spring-data-neo4j.version>4.2.0.M1</spring-data-neo4j.version>
<neo4j.ogm.version>2.0.5</neo4j.ogm.version>
最佳答案 这是因为OGM认为这是一个模糊的模型.如果您将传入关系添加到用户,则应解决您的问题.
更新:经过进一步调查,这确实是一个错误.开业https://github.com/neo4j/neo4j-ogm/issues/276
解决方法是在广告和用户中注释所有getter和setter(并确保@Relationship注释包含关系类型和方向).