2013-08-22 80 views
0

花了多天的时间试图找出为什么这不起作用。我的模特是Player-[:PLAYED_WITH_TEAM]->team-[:CONTESTED_IN]->league。这种关系的几个例子如下:无法在两个节点之间创建超过2个相同的关系

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关系。

我使用弹簧数据并定义了实体。我能够使用弹簧数据创建2个这样的关系但不超过两个。即如果鲍勃在同一队猎鹰队为另一个第三联赛效力,我无法创造第三关系。我不确定问题出在哪里。以下是我创建新关系的代码。 PlayedWith是RelationshipEntityPlayer作为起始节点,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

你不需要鲍勃和猎鹰之间,但猎鹰与新联赛之间增加相互之间的关系是这样的:

(falcons)-[:CONTESTED_IN]->(NEWLeague) 

鲍勃效力于猎鹰和隼则在ABC联赛争夺, XYZ联盟和新联盟鲍勃暗中在这三个联赛中打球。

+0

这是我的初始模型,但这种方法有一个缺点。你怎么能找到只玩过XYZ联盟的猎鹰队员?玩家可能不会玩所有的联赛。 –

+0

然后你需要从球员到联盟的其他关系。 – h3nrik

0

其实应该只有一个:PLAYED_WITH_TEAM bob和猎鹰之间的关系。 你确定你的查询是正确的:获得鲍勃和猎鹰之间PLAYED_WITH_TEAM关系的数量?

从SDN参考文档:

春数据的Neo4j确保在默认情况下只存在一个 任何给定的两个实体之间的给定类型的关系。通过使用createRelationshipBetween()方法和 存储库或实体上的allowDuplicates参数,可以规避 。

相关问题