当前位置: 首页 > 知识库问答 >
问题:

带有Spring Boot和Spring数据Neo4j的REST API

邢鸿博
2023-03-14

我正在尝试使用spring boot作为后端,Angular作为前端,并使用Neo4j数据库作为应用程序,它是一个面向图形的NoSQL数据库。我的问题是,我不知道如何在节点中使用复杂的数据,我的意思是。我正在编程的应用程序将基于microservices体系结构,其中Angular(前端)中的应用程序将通过spring boot制作的后端Rest API插入并使用数据,该API将数据存储在运行Neo4j数据库实例的服务器中。这是我正在做的一个例子。这是应用程序。属性文件

Spring数据neo4j。uri=bolt://localhostSpring数据neo4j。username=neo4j-spring。数据neo4j。密码=秘密

这是我的域模型示例类:

@NodeEntity
public class Contact {
    @Id
    Long id;
    String name;
    String address;
    String city;
    String phone;
    String email;

    public Contact(String name, String address, String city, String phone, String email) {
        this.name = name;
        this.address = address;
        this.city = city;
        this.phone = phone;
        this.email = email;
    }
//get and set
    }

正如您所看到的,是一个具有不同属性的简单类,但这些属性本质上可以是更复杂的数据,例如地址,它本身可以是一个节点,由属性、城市、街道、国家、#、。。。

我的存储库应该是这样简单的:

public interface ContactRepository extends Neo4jRepository<Contact,Long>{
    Collection<Contact> findByName(String name);
    @Override
    void delete(Contact deleted);
}

ContactService类将负责处理ContactRepository

@Service
public class ContactService {
    @Autowired
    private final ContactRepository contactRepository;

    public ContactService(ContactRepository contactRepository) {
        this.contactRepository = contactRepository;
    }

    @Transactional(readOnly = true)
    public Iterable<Contact> contact() {
        return contactRepository.findAll();
    }

    @Transactional(readOnly = true)
    public Contact show(Long id) {
        return contactRepository.findById(id).get();
    }

    public Contact save(Contact contact) {
        contactRepository.save(contact);

        return contact;
    }

    public Contact update(Long id, Contact contact) {
        Contact c = contactRepository.findById(id).get();
        if (contact.getName() != null)
            c.setName(contact.getName());
        if (contact.getAddress() != null)
            c.setAddress(contact.getAddress());
        if (contact.getPhone() != null)
            c.setPhone(contact.getPhone());
        if (contact.getEmail() != null)
            c.setEmail(contact.getEmail());
        contactRepository.save(c);
        return contact;
    }
    public String delete(Long id) {
        Contact contact = contactRepository.findById(id).get() ;
        contactRepository.delete(contact);

        return "";
    }
}

最后,控制器负责RESTAPI

@RestController
public class ContactController {
    @Autowired
    private ContactService contactService;

    @RequestMapping(method = RequestMethod.GET,value = "/contacts")
    public Iterable<Contact> contact(){
        return contactService.contact();
    }

    @RequestMapping(method = RequestMethod.POST,value = "/contacts")
    public Contact save(@RequestBody Contact contact){
        return contactService.save(contact);
    }
    @RequestMapping(method = RequestMethod.GET,value = "/contacts/{id}")
    public Contact show(@PathVariable Long id){
        return contactService.show(id);
    }
    @RequestMapping(method = RequestMethod.PUT,value = "/contacts/{id}")
    public Contact update(@PathVariable Long id,@RequestBody Contact contact){
       return contactService.update(id,contact);
    }
    @RequestMapping(method = RequestMethod.DELETE,value = "/contacts/{id}")
    public String delete(@PathVariable Long id){
        contactService.delete(id);
        return "";
    }
}

为了测试API的工作方式,使用以下命令

curl -i -H "Accept: application/json" localhost:8080/contacts

因此

HTTP/1.1200内容类型:application/json;charset=UTF-8传输编码:分块日期:2018年7月5日星期一12:14:39 GMT[]

在数据库中插入新联系人的步骤

curl -i -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","address":"Jl. Cipaganti No.112","city":"Bandung","phone":"0811223112233","email":"john.doe@dummy.com"}' localhost:8080/contacts

结果会返回

HTTP/1.1200内容类型:application/json;charset=UTF-8传输编码:分块日期:2018年7月6日星期二02:59:00 GMT{“id”:“5A7919F4B9D4F13CB6F539”,“姓名”:“John Doe”,“地址”:“Jl.Cipaganti No.112”,“城市”:“万隆”,“电话”:“0811223112233”,“电子邮件”:“John”。doe@dummy.com"}

当我尝试更改NodeEntity类的address属性时,问题就出现了,因为我已经看过很多教程,但是只有如何使用RESTAPI没有给出如何插入数据。如何向Contact类添加address属性,该属性是表示数据库中节点(NodeEntity)的类?我如何执行curl命令来证明api工作正常,因为现在address属性将是一个具有多个属性的类,例如city、street、country、#、。。。?

我希望你能帮助我,谢谢你抽出时间。

共有1个答案

陶寒
2023-03-14
@NodeEntity
public class Contact {
@Id
Long id;
String name;
@Relationship(type = HAS_ADDRESS)
Address address;
}
just create a relationship between 2 nodes and save as an embeded node.

您可以创建与上述节点类似的地址节点,如下所示

@NodeEntity
public class Address{ 
 // properties and getter setters.
}
 类似资料:
  • Neo4j 2.0。0已发布。所以我更新了neo4j版本2.0。0.M6到2.0。0.0发布。并尝试在我的网站中更新模型,但出现异常。 组织。springframework。刀。DataIntegrityViolationException:唯一属性类java。lang.String rankStatId rel:false idx:true被设置为重复值3073631_99 MY SDN版本是2

  • 我终于能够在我的java应用程序中创建一个服务器实例,使用嵌入式数据库,如下所述。当我在Eclipse上运行它时,它可以正常工作,但这实际上不是我的目的(我的应用程序在其他事情之间,为数据库提供新的节点和关系)。我有一个Neo4j盒子,它应该是我的服务器实例,我想把我的应用程序作为JAR文件部署在那里。这样,我想从那里访问web界面。我已经对它进行了测试:在我的开发机器上运行java应用程序时,同

  • 是否有人拥有使用GrailsV3的SpringDataNeo4j(3.3.0)并愿意共享配置? 我想让Web界面工作(按这里:如何启用neo4j webadmin时使用sping-data-neo4j?),但我有点失去了当试图找出什么应该去,作为Grails从扩展它,所示示例从扩展它。

  • 我试图编写一个返回大量数据(200个节点)的查询。节点非常简单: 我最初使用Spring Data Neo4j模板接口,但在返回大约100个节点后发现它非常慢。 所以,我的问题是:是否有一种方法可以提供标签作为Cypher查询的一部分,以防止需要再次查询每个节点?或者,除此之外,是否有一种方法可以为SDN提供一个包含标签和属性的并将其转换为POJO? 注意:我意识到SDN团队正在未来的版本中完全使

  • 我正在尝试将vaadin与spring(没有Spring Boot)和基于java注释的spring部分配置结合起来。 自动连接似乎适用于vaadin ui部分,但不适用于“自定义ui类”(例如,“公共类LoginScreen扩展自定义组件”)。我在SysOut上得到一个NPE或一个空对象。 此外,我注意到“@ComponentScan(base Packages={"net.myapp"})”没

  • 我在我的脚手架上工作,我似乎无法让尼奥嵌入初始化。我使用Neo 2,所以我运行Spring数据3.0.0. m1。我不能让它亮起来。这是我的背景 但我有个例外 我找不到任何地方说有更多的构造函数参数。 这是我的依赖项