1

開始在一個新項目上工作... RESTful爲社交網絡平臺提供服務的層。
Neo4j的是主數據存儲我的不二之選,我收到,但沒有利用春數據能力與合作,POJO映射到這似乎很方便節點的機會。
Neo4j社交RESTful層的Spring數據POC

目標:

  1. 該層應該提供支持像到Facebook的圖形API,其定義爲每個實體/對象相關的性質&連接可以從URL來指代。
    FB Graph API

  2. 如果可能,我想避免將從域實體序列化/傳輸對象,並使用我的域名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嗎?


也就是說它現在....關於我上面提出的將受到歡迎任何方式任何意見。謝謝。

+0

哇,這是很多問題。 –

回答

3

開始回答,不完整:

也許升級到該版本.RELEASE?

問題1

如果要序列AspectJ的實體到JSON你必須排除由高級映射產生的內場(見本forum discussion)。

當您使用高級映射@Fetch是不必要的,因爲無論如何都是從數據庫讀取數據的。

問題2

對於分頁的字段,您可以嘗試使用CYPHER查詢與@QueryLIMIT 100 SKIP 10作爲一個固定的參數。否則,您可以使用存儲庫/模板實際上使用分頁信息填充實體字段中的集合。

問題3

我不認爲回報型的@Query的必須是一個Iterable它也應該與其他類型(類別或具體類型)工作。你碰到什麼問題?

爲了創建遞歸關係 - 嘗試首先存儲關係對象本身,然後只存儲節點實體。或者使用template.createRelationshipBetween(start, end, type, allowDuplicates)創建關係。

問題5

當你正在使用SDN在REST它可能不表現非常好,因爲現在的底層實現使用RestGraphDatabase細粒度的操作和先進的映射使用非常細粒度調用。你有什麼理由不使用嵌入模式?針對REST服務器,我肯定會使用簡單映射並嘗試主要通過密碼來處理讀取操作。

對於REST APi,每個http-call只有一個tx,具有較大交易的唯一選擇是使用rest-batch-api

在底層的rest-graph-database中有一個僞事務處理支持,它在一個批處理請求中批量執行一個「事務」中執行的調用。但是這些調用在tx期間不能依賴讀取結果,只有在tx結束後纔會填充。在SDN中使用這種方法也存在一些問題,所以我禁用了它(它是rest-graphdb的配置選項/系統屬性)。

問題6

現在只是用來對付一個JPA /關係存儲兩者的MongoDB和Neo4j的跨店的支持。我們曾經討論過在春季數據項目之間有跨庫存的參考,但沒有跟進。

+0

嗨邁克爾和感謝您的快速反應..... –

+0

嗨邁克爾和感謝您的快速反應.....關於問題1:我沒有問題的序列化到JSON我只是想要幾個特定的​​領域將自動加載。關於問題3:我得到這個異常java.lang.ClassCastException:org.springframework.data.neo4j.rest.SpringEndResult不能轉換爲java.util.Collection ...其餘的答案很清楚..你能否請參閱我到一個使用aspectJ + neo4j + spring數據的教程..最後一個問題與REST服務器一起使用的主要用例是什麼?謝謝 –