我已经为我的应用程序中可以拥有订阅者的所有实体实现了一个基类:
@NodeEntity
public abstract class Subscribable extends BaseEntity {
private final static String SUBSCRIBED_TO = "SUBSCRIBED_TO";
@Relationship(type = SUBSCRIBED_TO, direction = Relationship.INCOMING)
private Set<User> subscribers = new HashSet<>();
public Set<User> getSubscribers() {
return subscribers;
}
public void setSubscribers(Set<User> subscribers) {
this.subscribers = subscribers;
}
public boolean addSubscriber(User subscriber) {
return subscribers.add(subscriber);
}
}
此外,我还有一些扩展Subscribable
类的具体类型,例如Product
,Tag
,User
等
现在为了让所有User
订阅特定Subscribable
,我使用以下方法和Cypher查询:
@Query("MATCH (sub:Subscribable)<-[:SUBSCRIBED_TO]-(u:User) WHERE id(sub) = {subscribableId} RETURN u")
Set<User> findAllUsersBySubscribableId(@Param("subscribableId") Long subscribableId);
问题在于AFAIK不同类型的不同对象可能具有相同的Id,因此看起来仅基于User
(GraphId)获取所有subscribableId
的方法不能保持一致且可能导致不同的结果。
我们的想法是为findAllUsersBySubscribableId
方法提供额外的参数,例如String type
,以便指定我在subscribableId
提供的确切类型。例如“Product”
请帮助扩展以下Cypher查询以支持实体类型:
MATCH (sub:Subscribable)<-[:SUBSCRIBED_TO]-(u:User) WHERE id(sub) = {subscribableId} RETURN u