gpt4 book ai didi

java - 如何使用 Neo4j 使一个 java 类与另一个类相关?

转载 作者:行者123 更新时间:2023-12-01 13:51:33 24 4
gpt4 key购买 nike

我有课House和一个类Room 。每个类都是 NodeEntity并保存在单独的存储库中,HouseRepositoryRoomRepositoryHouse包含 Set<Room> 。我希望能够删除 Room实例并自动将该实例从 Set<Room> 中删除House里面类(class)。由于 Neo4j 是一个图形数据库,我认为我应该能够声明 House 之间的关系每个 Room并删除 Room实例会自动处理这个问题。以下两个类代表 HouseRoom .

@NodeEntity
public class House {

@GraphId
private Long id;

@Indexed(unique=true) String uid;

@RelatedTo (type="addition", direction=Direction.OUTGOING)
@Fetch
private Set<Room> rooms;

public House(String uid, Set<Room> rooms) {
this.uid = uid;
this.rooms = rooms;
}

public House() {
this.uid = //random uid;
}
}


@NodeEntity
public class Room {

@GraphId
private Long id;

@Indexed(unique=true) String uid;

public Room(String uid) {
this.uid = uid;
}

public Room() {
this.uid = //random uid;
}
}

我想我应该能够在 RoomRepository 中编写 Cypher 查询那会解决这个问题,但我不确定。我想到了这样的事情:

public interface RoomRepository extends BaseRepository<Room>{

@Query("start room=node({0}) " +
"match house-[:addition*]->room" +
"delete room")
public void deleteRoomAndRemoveRoomFromHouse(String uid);
}

处理这些类型的删除的推荐方法是什么?

最佳答案

你的方法应该几乎有效。您可能会遇到异常,因为您在没有先删除节点关系的情况下尝试删除节点。 (除非 SDN 魔法为你解决了这个问题,但我不认为它会拦截密码查询。)

作为您的MATCH子句成立,它将充当过滤器,这意味着绑定(bind)到 room 的任何内容。仅当您到达 delete 时,才会保留开始子句中的标识符。子句是否有至少深度为1的相关关系。如果你作为参数传递的房间没有至少一个传入[:addition]关系就不再绑定(bind),也不会被删除。也许这是故意的,如果是这样,请保留它,但添加(否则替换为)一个匹配子句,该子句绑定(bind)所有房间关系并在删除房间之前删除它们。尝试类似的事情

START room=node({0})
MATCH room-[r]-()
DELETE r, room

但我认为要么是存储库,要么是 Neo4jTemplate应该有足够的巫毒来为你处理这种操作。或者,如果您使用 AspectJ 的高级映射,你的room中可能会烘焙各种巧克力片。实体。我知道有一个NodeEntity#persist() ,我认为有一个NodeEntity#remove()也是如此。

一旦节点被删除,它就不会出现在Set<Room>中您的房间等级字段。 (如果您使用简单映射,您可能必须检索它或手动将其同步到数据库,可能是 Neo4jTemplate#fetch() ,传递 Set<Room> 字段,将为您完成此操作。)

关于java - 如何使用 Neo4j 使一个 java 类与另一个类相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com