花了好几天试图弄清楚为什么这不起作用。我的模型是Player-[:PLAYED_WITH_TEAM]->team-[:CONTESTED_IN]->league
。这种关系的几个实例如下
bob-[:PLAYED_WITH_TEAM]->falcons-[:CONTESTED_IN]->ABC League
alice-[:PLAYED_WITH_TEAM]->falcons-[:CONTESTED_IN]->ABC League
bob-[:PLAYED_WITH_TEAM]->falcons-[:CONTESTED_IN]->XYZLeague
鲍勃在ABC和XYZ两个联赛中为同一支球队“猎鹰队”效力。这是我想捕捉的事实。由于Bob在2个不同的联赛中为同一支球队效力,我需要在同一个开始(Bob)和结束(Falcons)节点之间有两个PLAYED_WITH_TEAM关系。
我正在使用spring数据并定义了实体。我能够使用spring数据创建2个这样的关系,但不能超过2个。也就是说如果鲍勃为另一个第三联赛的同一队猎鹰队效力,我无法建立第三关系。我不确定问题出在哪里。下面是我创建新关系的代码。 PlayedWith为RelationshipEntity
,其中Player
为起始节点,Team
为结束节点。
private PlayedWith createPlayedWithRelation(League currentLeague, Team team, Player p)
{
System.err.println("Creating PLAYED_WITH_TEAM relation between " + team + " and " + p + " and " + currentLeague);
PlayedWith playedWith = template.createRelationshipBetween(p, team, PlayedWith.class, "PLAYED_WITH_TEAM", true);
playedWith.setDuring(currentLeague.getStartDate());
playedWith.setInLeague(currentLeague);
playedWith.setPlayer(p);
playedWith.setTeam(team);
playedWith.setAsCaptain(p.isCaptain());
team.addPlayer(p);
template.save(playedWith);
return playedWith;
}
PlayedWith
@RelationshipEntity (type = "PLAYED_WITH_TEAM")
public class PlayedWith
{
@GraphId
private Long nodeId;
@StartNode
Player player;
@Fetch
@EndNode
Team team;
}
如果存在另一种存储此方案的方法,请告诉我。
答案 0 :(得分:0)
你不需要在鲍勃和猎鹰之间添加另一种关系,而是在猎鹰和新联盟之间添加这样的关系:
(falcons)-[:CONTESTED_IN]->(NEWLeague)
由于鲍勃为猎鹰队和猎鹰队效力,然后在ABC联赛,XYZ联赛和新联盟的比赛中有争议,他们在这三个联赛中发挥了作用。
答案 1 :(得分:0)
实际上应该只有一个:鲍勃和猎鹰之间的PLAYED_WITH_TEAM关系。 你确定你的查询是否适合获得Bob和猎鹰之间的PLAYED_WITH_TEAM关系?
来自SDN参考文档:
请注意
Spring Data Neo4j默认确保只有一个 任何两个给定实体之间给定类型的关系。这个可以 通过使用createRelationshipBetween()方法来规避 存储库或实体上的allowDuplicates参数。