開始在一個新項目上工作... RESTful爲社交網絡平臺提供服務的層。
Neo4j的是主數據存儲我的不二之選,我收到,但沒有利用春數據能力與新合作,POJO映射到這似乎很方便節點的機會。
Neo4j社交RESTful層的Spring數據POC
目標:
該層應該提供支持像到Facebook的圖形API,其定義爲每個實體/對象相關的性質&連接可以從URL來指代。
FB Graph API如果可能,我想避免將從域實體序列化/傳輸對象,並使用我的域名POJO的作爲JSON的從客戶端轉移到/。
實例:
HTTP GET /簡檔/ {ID} /字段= ... &連接= ...的響應將是資料對象?包含URL中的請求。
HTTP GET /資料/(編號)/故事/?場= .. &連接= ... &頁= .. &排序= ...響應將是故事列表根據要求的對象。
有關版本:
- Spring框架3.1.2
- 春數據的Neo4j 2.1.0.RC3
- 春數據的MongoDB 1.1.0.RC1
- AspectJ 1.6.12
- 傑克遜1.8.5
爲簡單起見,我們有檔案,故事節點和角色它們之間的關係。
public abstract class GraphEntity {
@GraphId
protected Long id;
}
檔案節點
@NodeEntity
@Configurable
public class Profile extends GraphEntity {
// Profile fields
private String firstName;
private String lastName;
// Profile connections
@RelatedTo(type = "FOLLOW", direction = Direction.OUTGOING)
private Set<Profile> followThem;
@RelatedTo(type = "BOOKMARK", direction = Direction.OUTGOING)
private Set<Story> bookmarks;
@Query("START profile=node({self}) match profile-[r:ROLE]->story where r.role = FOUNDER and story.status = PUBLIC")
private Iterable<Story> published;
}
故事節點
@NodeEntity
@Configurable
public class Story extends GraphEntity {
// Story fields
private String title;
private StoryStatusEnum status = StoryStatusEnum.PRIVATE;
// Story connections
@RelatedToVia(type = "ROLE", elementClass = Role.class, direction = Direction.INCOMING)
private Set<Role> roles;
}
角色關係
@RelationshipEntity(type = "ROLE")
public class Role extends GraphEntity {
@StartNode
private Profile profile;
@EndNode
private Story story;
private StoryRoleEnum role;
}
起初我並沒有使用的AspectJ的支持,但我覺得我的用例是非常有用的原因是產生POJO到實際節點之間的分隔符,因此我可以根據請求輕鬆請求屬性/連接,並且Domain Driven Design Approach看起來非常好。
問題1 - AspectJ的:
比方說,我要爲對象定義默認字段,這些字段將被返回給客戶端是否如果URL或沒有要求...所以我試圖在這些字段上使用@FETCH註釋,但在使用AspectJ時似乎不起作用。 在我這樣做的那一刻..
public Profile(Node n) {
setPersistentState(n);
this.id = getId();
this.firstName = getFirstName();
this.lastName = getLastName();
}
是否實現了正確的方法?即使使用AspectJ也應該支持註釋嗎?
我會很樂意獲得有關AspectJ + Neo4j沒有找到任何東西的示例/博客。
問題2 - 分頁:
我想請求例如
/資料/(編號)具體連接時支持分頁/故事/,如果故事相關如下
// inside profile node
@RelatedTo(type = "BOOKMARK", direction = Direction.OUTGOING)
private Set<Story> bookmarks;
/資料/(編號)/故事/,如果相關的故事如下
// inside profile node
@Query("START profile=node({self}) match profile-[r:ROLE]->story where r.role = FOUNDER and story.status = PUBLIC")
private Iterable<Story> published;
是分頁支持開箱即用兩種@Query || @相關型號:@RelatedToVia使用Pageable接口檢索頁面而不是Set/List/Iterable?限制和排序應該是動態的,取決於客戶的要求...我可以使用Cypher Query DSL來實現,但更喜歡使用基本..其他方法將被愉快地接受。
問題3 - @Query與{}自我:
類愚蠢的問題,但我不能幫助它:),似乎使用@Query節點實體內時(使用{}自我參數}返回類型必須是可迭代其意義.. 讓我們的例子...
// inside profile node
@Query("START profile=node({self}) match profile-[r:ROLE]->story where r.role = FOUNDER and story.status = PUBLIC")
private Iterable<Story> published;
當請求公佈的連接:
// retrieving the context profile
Profile profile = profileRepo.findOne(id);
// getting the publishe stories using AspectJ - will redirect to the backed node
Iterable<Story> published = profile.getPublished();
// set the result into the domain object - will throw exception of read only because the type is Iterable
profile.setPublished(published);
有沒有解決方法?這是沒有創造將內部資料被@Transiant另一個屬性..
問題4 - 遞歸關係:
我有一些問題,傳遞/遞歸關係,當分配新角色檔案在故事的關係,實體角色含有@EndNode故事,其中包含角色連接 ...,其中之一是上下文作用以上,它是永遠不會結束:)... 是否有配置方式春季數據引擎不會創造這些永無止境的關係?
問題5 - 交易:
也許我應該以前也說過,但我使用了Neo4j的DB REST服務器,從以前的閱讀中,我明白,有不支持亂交易中的盒子?使用嵌入式服務器 我有以下代碼...
Profile newProfile = new Profile();
newProfile.getFollowThem().add(otherProfile);
newProfile.getBookmarks().add(otherStory);
newProfile.persist(); // or profileRepo.save(newProfile)
將在運行中交易使用REST服務器時的時候是怎樣的?這裏有幾個操作,如果一個失敗都失敗了?
問題6 - 蒙戈+的Neo4j:
我需要存儲哪些沒有關係性質..像飼料,評論,按摩數據。
我想過與MongoDB集成來存儲這些..我可以拆分域pojo字段/連接到mongo/neo4j與跨商店支持?它會支持AspectJ嗎?
也就是說它現在....關於我上面提出的將受到歡迎任何方式任何意見。謝謝。
哇,這是很多問題。 –