我正在尝试使用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、#、。。。?
我希望你能帮助我,谢谢你抽出时间。
@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。我不能让它亮起来。这是我的背景 但我有个例外 我找不到任何地方说有更多的构造函数参数。 这是我的依赖项