Spring Data REST Neo4j create a relationship -
i'm building little test app way learn angular , refresh myself on lot of spring stack. have minor experience neo4j, app idea has ground graph db neo4j.
the idea pretty simple, ui create characters , stories, , relate characters stories , each other, map individual versions of story , create graphs show character interactions write overall narrative.
i've got nodes characters , stories enough , spring stack great giving me rest easy use rest endpoints nodes themselves. can't find concrete examples of creating , maintaining relationships between nodes.
for instance, in cypher, can relate character story , tell being's involvement story relationship property with:
match(p:being ),(s:story ) id(p) = 7 , id(s) = 16 create (p)-[r:took_part_in{perspective:"i did not know mr. grey better acquaintance, though knew others whom did. not made better because of relationship him."}]->(s) return r
then mapping in spring, data rest endpoint gives me character , can follow link stories character part of. don't see way though post or put add or remove character stories.
i'm finding concrete examples in docs spring regarding nodes, not edges/relationships. can supply that?
i aware neo4j has it's own rest interface, , spring consuming well. main purpose of exercise learning new technology (angular2/typescript) , refreshing knowledge of spring stack
thanks!
i'm not sure if else has ever found or better answer this, here had found work. have spring boot project running, i'll post of pertinent code , examples in answer, see whole rest service project, check https://github.com/jrspriggs/chronicler
so, purpose atm small app create characters/beings take part in stories, create stories (featuring title , slug line) , create relationship between being , story being's perspective of story attached relationship. way collects various versions of story each character.
the neo4j instance basic neo4j instance in docker/kitematic on windows laptop. here models:
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 (relationship between being story)
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; } }
from there have base kind of repository rest resource classes set spring data services. take care of entities, fail address relationship me. implement separate rest route save it
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; } }
from there, posting localhost:3000/beingstory following kind of json body accurately create relationship:
{ "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 monstrous thing. wanted create life, created horrors... such unimaginable horrors, such mankind has not ever imagined." }
from point then, can walk relationships person story. i'll have add more in future work through sample app more implement reverse relationship seeing character involvements selected story, , intend add relationships between characters.
Comments
Post a Comment