2

저는 Spring 스택에서 Angular를 배우고 새로 고침하는 방법으로 약간의 테스트 응용 프로그램을 구축하고 있습니다. Neo4J에 대한 약간의 경험이 있지만 응용 프로그램 아이디어는 Neo4j와 같은 그래프 DB를 기반으로합니다.스프링 데이터 REST Neo4j가 관계를 생성합니다.

아이디어는 매우 간단합니다. 캐릭터와 스토리를 만들고, 캐릭터를 스토리와 서로 관련시키고, 스토리의 개별 버전을 매핑하고, 캐릭터 상호 작용을 보여줌으로써 전체를 작성하는 데 도움이되는 그래프를 만듭니다 이야기.

문자와 스토리에 대한 노드를 쉽게 확보 할 수 있으며 Spring 스택은 노드 자체에서 나머지 엔드 포인트를 쉽게 사용할 수있게 해줍니다. 그러나 이러한 노드 간의 관계를 만들고 유지하는 구체적인 예는 찾을 수 없습니다.

는 예를 들어, 사이퍼에, 나는 이야기에 문자를 관련이 수와 관계 속성으로 이야기에 그 존재의 참여를 말해 : 다음

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 엔드 포인트에서 돌아와 내 캐릭터를 제공하고 캐릭터가 속한 이야기를 얻기 위해 링크를 따라갈 수 있습니다. 이야기에서 등장 인물을 추가하거나 삭제하는 방법을 게시하거나 배치하지는 않습니다.

나는 봄에 관한 문서에서 노드에 관한 구체적인 예를 찾고 있지만 가장자리/관계는 실제로는 없습니다. 누구나 그런 것을 공급할 수 있습니까?

Neo4J에는 자체 REST 인터페이스가 있으며, 기본적으로 스프링이 소비하는 것과 마찬가지라는 것을 충분히 알고 있습니다. 이 실습의 주요 목적은 새로운 기술 (Angular2/typescript)을 익히고 스프링 스택에 대한 지식을 새로이 익히는 것입니다.

고마워요!

+0

당신이 본, 생성/봄 데이터 Neo4j와 관계 수정에 대한 문서를 찾고 http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/ – Luanne

답변

2

다른 사람이이 문제에 대해 좋은 답변을 찾았는지 확실하지 않지만 여기서는 내가 찾은 것이 있습니다. 나는 스프링 부트 프로젝트를 실행 중이다. 가장 적절한 코드와 예제를이 답변에 게시 하겠지만, 전체 REST 서비스 프로젝트를 확인하려면 https://github.com/jrspriggs/Chronicler

그래서 작은 앱의 목적은 다음과 같다. 스토리에 참여하는 캐릭터/존재를 만들고 스토리 (제목과 슬러그 라인을 특징으로 함)를 작성하고 존재와 스토리 사이의 관계를 만듭니다. 이 방법은 각 캐릭터로부터 다양한 버전의 스토리를 수집합니다.

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; 
    } 
} 

I 기본적으로 스프링 데이터 서비스를 위해 설정된 저장소 종류 리소스 클래스의 기본 종류를 갖습니다. 그들은 엔티티를 돌보지 만, 그들은 나를 위해 관계를 해결하지 못합니다.거기에서

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에 게시 : 정확하게 관계를 만들 것입니다 JSON 본체의 다음과 같은 종류 3000/beingStory 무엇을하는 일은 그것을 저장하기 위해 별도의 휴식 경로를 구현하는

BeingController.java입니다 :

{ 
    "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." 
} 

그 시점부터 사람과 이야기를 이어갈 수 있습니다. 이 예제 애플리케이션을 통해 선택한 스토리에서 캐릭터 관련성을 확인하기 위해 역방향 관계를 구현하기 위해 더 많은 것을 추가 할 예정이며 앞으로 문자를 추가 할 예정입니다. 당신을 가정

관련 문제