2

私は、角を学び、多くの春のスタックで自分自身をリフレッシュする方法として、少しテストアプリケーションを構築しています。私はNeo4Jのマイナーな経験をいくつか持っていますが、Appアイデアは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エンドポイントから戻ってきて私に私のキャラクターを与え、キャラクターの一部であるストーリーを得るためのリンクをたどることができます。私は物語の中に登場人物を追加したり削除したりすることはありません。

私はまた、ノードに関する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はストーリーに参加するキャラクター/ビーイングを作成し、ストーリー(タイトルとスラッグラインを特徴とする)を作成し、その関係に付けられたストーリーの視点からストーリーとストーリーの関係を作ります。この方法で、各キャラクターからさまざまなバージョンのストーリーを収集します。

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

そこから私は基本的に春のデータサービスのために設定された基本的なリポジトリレストリソースクラスを持っています。彼らはエンティティを世話しますが、実際には私の関係には言及していません。そこから

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

その時点から、人間とストーリーの関係を歩くことができます。このサンプルアプリケーションを使って、選択したストーリーからキャラクターの関与を確認するための逆の関係を実装するには、もう少し追加しなければならないでしょう。文字間にリレーションシップを追加しようと考えています。

関連する問題