2

我正在構建一個小測試應用程序,作爲學習Angular的一種方式,並在很多Spring堆棧上刷新自己。我對Neo4J有一些小小的經驗,但是應用的想法已經有了像Neo4j這樣的圖形數據庫。Spring Data REST Neo4j創建關係

這個想法非常簡單,用戶可以創建角色和故事,並將角色與故事和每個角色關聯起來,映射故事的單個版本,並創建一些圖形來顯示角色交互以幫助編寫整體敘述。

我已經有了足夠容易理解角色和故事的節點,並且Spring堆棧非常適合讓我休息,以便節點自己使用休息終端。但是我找不到任何創建和維護這些節點之間關係的具體例子。

例如,在Cypher支架,我能與一個字符一個故事,講的是幸福的參與到故事有關係屬性:

match(p:Being),(s:Story) where id(p) = 7 and id(s) = 16 create (p)-[r:TOOK_PART_IN{perspective:"I did not know Mr. Grey better than an acquaintance, though I knew others whom did. They were not made better because of their relationship with him."}]->(s) return r

然後在春天的映射,數據我從REST端點返回給我我的角色,我可以按照鏈接獲取角色所屬的故事。我沒有看到任何方式發佈或添加或刪除故事中的角色。

我也只能從Spring的文檔中找到關於節點的具體示例,而不是真正的邊緣/關係。任何人都可以提供這樣的東西?

我完全意識到Neo4J有它自己的REST接口,這也是Spring正在消費的東西。這個練習的主要目的是學習一些新技術(Angular2/typescript)並且更新我對Spring棧的瞭解

謝謝!

+0

假設您正在尋找有關使用Spring Data Neo4j創建/修改關係的文檔,您是否看到過http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/ – Luanne

回答

2

我不確定其他人是否曾經找到一個好或更好的答案,但這是我發現的工作。我有一個春季啓動項目運行,我會發布一些最相關的代碼和例子在這個答案,但看到整個REST服務項目,檢查https://github.com/jrspriggs/Chronicler

因此,小應用程序的目的atm是創造參與故事的角色/生物,創造故事(以題目和slu line線爲特徵),並在存在與故事之間建立一種關係,與存在於關係中的故事的角度一致。這樣它就從每個角色收集故事的各種版本。

neo4j實例只是我的Windows筆記本電腦上的Docker/Kitematic中的一個基本neo4j實例。下面是型號:

Being.java:

package com.chronicler.model; 

import java.util.Iterator; 
import java.util.Set; 

import org.springframework.data.neo4j.annotation.Fetch; 
import org.springframework.data.neo4j.annotation.GraphId; 
import org.springframework.data.neo4j.annotation.NodeEntity; 
import org.springframework.data.neo4j.annotation.RelatedTo; 
import org.springframework.data.neo4j.annotation.RelatedToVia; 
@NodeEntity 
public class Being { 

    public Long getId() { 
     return id; 
    } 
    @GraphId private Long id; 

    private String firstName; 
    private String lastName; 
    private boolean hero; 
    private boolean villain; 
    @RelatedToVia(type="TOOK_PART_IN") 
    @Fetch private Set<Involvement> involvements; 

    public Set<Involvement> getInvolvements() { 
     return involvements; 
    } 
    public void setInvolvements(Set<Involvement> involvements) { 
     this.involvements = involvements; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    public boolean isHero() { 
     return hero; 
    } 
    public void setHero(boolean hero) { 
     this.hero = hero; 
    } 
    public boolean isVillain() { 
     return villain; 
    } 
    public void setVillain(boolean villain) { 
     this.villain = villain; 
    } 
} 

Story.java

package com.chronicler.model; 

import org.springframework.data.neo4j.annotation.GraphId; 
import org.springframework.data.neo4j.annotation.NodeEntity; 

@NodeEntity 
public class Story { 
    public Long getId() { 
     return id; 
    } 
    @GraphId private Long id; 

    private String title; 
    private String slug; 
    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getSlug() { 
     return slug; 
    } 
    public void setSlug(String slug) { 
     this.slug = slug; 
    } 

} 

Involvement.java(即以故事之間的關係)

package com.chronicler.model; 

import org.springframework.data.neo4j.annotation.EndNode; 
import org.springframework.data.neo4j.annotation.Fetch; 
import org.springframework.data.neo4j.annotation.GraphId; 
import org.springframework.data.neo4j.annotation.RelationshipEntity; 
import org.springframework.data.neo4j.annotation.StartNode; 


@RelationshipEntity(type="TOOK_PART_IN") 
public class Involvement { 

    @GraphId private Long relationshipId; 
    @Fetch @StartNode private Being being; 
    @Fetch @EndNode private Story story; 
    private String perspective; 
    public Long getRelationshipId() { 
     return relationshipId; 
    } 
    public void setRelationshipId(Long relationshipId) { 
     this.relationshipId = relationshipId; 
    } 
    public Being getBeing() { 
     return being; 
    } 
    public void setBeing(Being being) { 
     this.being = being; 
    } 
    public Story getStory() { 
     return story; 
    } 
    public void setStory(Story story) { 
     this.story = story; 
    } 
    public String getPerspective() { 
     return perspective; 
    } 
    public void setPerspective(String perspective) { 
     this.perspective = perspective; 
    } 
} 

從那裏我基本上有爲彈簧數據服務設置的基礎類庫備件資源類。那些照顧實體,但他們沒有真正處理我的關係。什麼是實現一個單獨的休息路線保存

BeingController.java:

package com.chronicler; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import com.chronicler.model.Involvement; 
import com.chronicler.repo.InvolvementRepository; 

@RestController 
public class BeingController { 
    @Autowired 
    InvolvementRepository involvementRepository; 

    @RequestMapping(value="/beingStory", method=RequestMethod.POST) 
    public Involvement createBeingStoryRelationship(@RequestBody Involvement involvement) { 
     involvementRepository.save(involvement);   
     return involvement; 

    } 
} 

從那裏,只是張貼到localhost:3000/beingStory具有以下一種JSON身體會準確地創建關係:

{ 
    "character": { 
     "id": 17, 
     "firstName": "Dr. Victor", 
     "lastName": "Frankenstein", 
     "hero": true, 
     "villain": true 
     }, 
    "story": { 
     "id": 15, 
     "title": "Frankenstein", 
     "slug": "A doctor plays god" 
     }, 
    "relationshipId": 10, 
    "perspective": "I did a monstrous thing. I wanted to create life, but I created horrors... such unimaginable horrors, such that mankind has not ever imagined." 
} 

從那時開始,您可以將人與人之間的關係轉化爲故事。我將來需要添加更多內容,因爲我通過此示例應用程序進一步實現了用於查看所選故事中的角色參與的反向關係,並且我打算在角色之間添加關係。