我对Neo4J @RelationshipEntity
关系感到困惑。可用的例子很少且相差甚远。
到目前为止,我的进步包括反复尝试和大量猜测。
到现在为止,我都将关系以及节点包括在内,事情非常简单。获取节点,
编辑它并保留它,OGM做到了。不过,我不能将自己的头缠在@RelationshipEntities上。
我有一个简单的设置:
@NodeEntity
public class User {
. . .
@Relationship(type="MESSAGE", direction = Relationship.OUTGOING)
private Collection<Message> messagesSent;
@Relationship(type="MESSAGE", direction = Relationship.INCOMING)
private Collection<Message> messagesReceived;
. . .
}
这个想法很简单。消息是用户之间的关系,内容是关系的属性。 消息类(RelationshipEntity)看起来像这样:
@Component
@RelationshipEntity(type="MESSAGE")
public class Message {
@Id
@GeneratedValue
private Long id;
@StartNode
private User from;
@EndNode
private User to;
@Property
private String message;
. . .
}
我使用提供的save()方法通过这样的存储库持久存储我的用户节点:
@Repository
@Transactional
public interface UserRepository extends Neo4jRepository<User, Long>{
. . .
@Query("MATCH (user:User) WHERE user.username={0} RETURN user")
User getByUsername(String username);
. . .
}
我现在通过以下方式设置用户关系: 1)创建一条消息, 2)在邮件中添加用户(发送者和接收者), 3)在用户内部添加消息(?) 4)保存两个用户。
@Test
public void getFrom() {
Message m = new Message();
ArrayList<Message> lm = new ArrayList<>();
m.setMessage("This is a test");
m.setFrom(paul);
m.setTo(anne);
lm.add(m);
paul.setMessagesSent(lm);
anne.setMessagesReceived(lm);
userRepository.save(paul);
userRepository.save(anne);
Message nm = new Message();
nm.setMessage("Even newer message!");
nm.setFrom(anne);
nm.setTo(paul);
lm.clear();
lm.add(nm);
paul.setMessagesReceived(lm);
anne.setMessagesSent(lm);
// The order of saving affects the direction of the relationship. (?)
userRepository.save(anne);
userRepository.save(paul);
}
这时一切正常,从保罗到安妮,我收到一条消息,反之亦然。
问题:
A)即使我添加了用户paul作为接收者,并且已将接收者标记为即将来临的关系, 用户的保存顺序将最终影响关系的方向。为什么?方向总共标记为3 对象(2个用户和消息本身)。首先保存paul将导致两条消息从节点paul到节点anne具有相同的传出方向。
B)在我看来,这是一个非常复杂的过程。甚至正确吗?