为什么持久性顺序会影响Neo4j中两个节点之间的关系方向?

时间:2018-07-25 16:34:16

标签: spring-boot neo4j spring-data-neo4j

我对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)在我看来,这是一个非常复杂的过程。甚至正确吗?

0 个答案:

没有答案