我使用spring-data-neo4j创建了一个Maven项目。我还安装了独立的Neo4j Server Community Edition 2.3.3。我试图将一些Vertex对象保存到数据库,然后只是检索它们以检查一切正常。然后,我希望能够在独立服务器中打开创建的数据库,以实现更好的可视化。 我用作依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置类是:
@Configuration
@ComponentScan("neo4j.example")
@EnableAutoConfiguration
@EnableNeo4jRepositories("neo4j.example.repository")
public class App extends Neo4jConfiguration {
public App() {
System.setProperty("username", "neo4j");
System.setProperty("password", "root");
}
@Override
public SessionFactory getSessionFactory() {
return new SessionFactory("neo4j.example.model");
}
@Override
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
return super.getSession();
}
@Override
public Neo4jServer neo4jServer() {
return new RemoteServer("http://localhost:7474");
}
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
我的NodeEntity如下:
@NodeEntity
public class Vertex {
private String name;
@GraphId
private Long id;
@Relationship(type = "PAIRS_WITH", direction = "UNDIRECTED")
public Set<Vertex> teammates;
public Vertex() { }
// getters, setters, equals, toString
}
存储库:
@Repository
public interface VertexRepository extends GraphRepository<Vertex> {
Vertex findByName(String name);
List<Vertex> findByTeammatesName(String name);
}
服务:
@Service
public class VertexServiceImpl implements VertexService {
@Autowired
private VertexRepository vertexRepository;
@Override
@Transactional
public Vertex create(Vertex vertex) {
return vertexRepository.save(vertex);
}
@Override
@Transactional
public Iterable<Vertex> findAll() {
return vertexRepository.findAll();
}
//....
}
然后我有一个控制器,有两个简单的方法来保存顶点,然后查询数据库。
@RestController
@RequestMapping("/api/")
public class GraphController {
@Autowired
VertexService vertexService;
@RequestMapping(value = "addvertex", method = RequestMethod.GET)
public void add() {
Vertex v = new Vertex();
v.setId(1l);
v.setName("name");
Vertex v2 = new Vertex();
v2.setId(2l);
v.worksWith(v2);
vertexService.create(v);
}
@RequestMapping(value = "all", method = RequestMethod.GET)
public Iterable<Vertex> getAll() {
return vertexService.findAll();
}
}
当我将顶点保存到db时,没有错误。当我呼叫/所有数据库都是空的。我检查了messages.log,没有例外......最后一行是:
2016-03-26 14:25:15.716+0000 INFO [o.n.k.i.DiagnosticsManager] Interface Microsoft Wi-Fi Direct Virtual Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000:
2016-03-26 14:25:15.716+0000 INFO [o.n.k.i.DiagnosticsManager] --- INITIALIZED diagnostics END ---
2016-03-26 14:25:15.747+0000 INFO [o.n.k.i.DiagnosticsManager] --- STOPPING diagnostics START ---
2016-03-26 14:25:15.747+0000 INFO [o.n.k.i.DiagnosticsManager] --- STOPPING diagnostics END ---
2016-03-26 14:25:15.747+0000 INFO [o.n.k.i.f.GraphDatabaseFacade] Shutdown started
完全赞赏任何帮助!
答案 0 :(得分:3)
我设法解决了我的问题。配置很好,问题是我试图设置@NodeEntity对象的id属性。即使我删除了@GraphId属性,也不会保存顶点。 This post解决了同样的问题 In Good Relations:The Spring Data Neo4j Guide Book提到:“如果该字段简称为'id',则无需使用@GraphId对其进行注释,因为OGM会自动使用它。”
如果存在某种警告/错误消息或者文档中更明确地提到您不能设置setId()并且如果这样,节点将不会保存在数据库中,那将是很好的。希望这会节省一些时间!
答案 1 :(得分:2)
您正在混合嵌入式和远程服务器吗?
您应该在远程服务器中查找数据。
此外,您必须已禁用身份验证才能在服务器中使用,或者您必须为配置提供用户名(neo4j)和密码。
请勿在服务器使用的同一目录上启动嵌入式数据库