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

从那时开始,您可以将人与人之间的关系转化为故事。我将来需要添加更多内容,因为我通过此示例应用程序进一步实现了用于查看所选故事中的角色参与的反向关系,并且我打算在角色之间添加关系。