构建API以访问Neo4j数据

构建API以访问Neo4j数据,neo4j,Neo4j,我有一个巨大的Neo4j数据库,是我用批量导入工具创建的。现在,我想通过API(将在后端运行查询)向我的用户公开数据的某些部分。我的要求非常笼统: 1.延迟应为最小值 2.支持大约10-20的qps 有没有人能给我一些建议,说明我应该使用什么以及如何使用这些文档?我看到了几个ruby/rails和REST API的示例——但是它们专门用于按原样公开数据,而不需要在后端进行任何复杂的查询。我不知道如何将其转换为我想要的特定API。任何帮助都将不胜感激 谢谢。显然,您可以使用Rails/Sinatr

我有一个巨大的Neo4j数据库,是我用批量导入工具创建的。现在,我想通过API(将在后端运行查询)向我的用户公开数据的某些部分。我的要求非常笼统:
1.延迟应为最小值
2.支持大约10-20的qps

有没有人能给我一些建议,说明我应该使用什么以及如何使用这些文档?我看到了几个ruby/rails和REST API的示例——但是它们专门用于按原样公开数据,而不需要在后端进行任何复杂的查询。我不知道如何将其转换为我想要的特定API。任何帮助都将不胜感激


谢谢。

显然,您可以使用Rails/Sinatra之类的框架来实现自己的功能。如果您想要API格式的标准,我非常喜欢JSON API标准:

以下是Changelog播客中的一个片段:

还有一个用于创建资源对象的gem,用于确定哪些是公开的,哪些不是:

我在
neo4j
gem上尝试了一下,它在一个基本的层面上工作,尽管一旦你开始进入
include
s,似乎对ActiveRecord有一些依赖性。不过,我很想看到这样的问题得到解决

您还可以查看Facebook创建的GraphQL标准:

它有一颗红宝石:

当然,还有《变革日志》的另一集;)

Ruby的各种其他API资源:


显然,您可以使用Rails/Sinatra之类的框架来实现自己的功能。如果您想要API格式的标准,我非常喜欢JSON API标准:

以下是Changelog播客中的一个片段:

还有一个用于创建资源对象的gem,用于确定哪些是公开的,哪些不是:

我在
neo4j
gem上尝试了一下,它在一个基本的层面上工作,尽管一旦你开始进入
include
s,似乎对ActiveRecord有一些依赖性。不过,我很想看到这样的问题得到解决

您还可以查看Facebook创建的GraphQL标准:

它有一颗红宝石:

当然,还有《变革日志》的另一集;)

Ruby的各种其他API资源:


我编写了一个简单的Flask API示例,该示例与Neo4j接口,用于一个简单的演示(用于消息传递iOS应用程序的后端)

您可能会发现它是一个有用的参考:

还有一些在线资源可用于将Flask与Neo4j一起使用:


我编写了一个简单的Flask API示例,该示例与Neo4j接口,用于一个简单的演示(用于消息传递iOS应用程序的后端)

您可能会发现它是一个有用的参考:

还有一些在线资源可用于将Flask与Neo4j一起使用:

请查看。您可以直接在Neo4j(相同的JVM)上构建api,但必须使用Cypher、Java或Scala

我将从Cypher开始,因为您可以非常快速地编写它,然后优化性能,最后,如果所有其他操作都失败,并且延迟仍然很高,请转换为Java

您可以非常容易地公开子图(甚至部分水合的节点和关系,即仅某些属性)。签出
api
包中的内容。示例代码:

您可以编写一个控制器来返回一个人的图形,但只包括节点的名称(不包括年龄或其他任何内容):

@RestController
公共类API示例{
私有最终图形DatabaseService数据库;
@自动连线
公共API示例(GraphDatabaseService数据库){
this.database=数据库;
}
@请求映射(path=“person/{name}”)
public JsonGraph getPersonGraph(@PathVariable(value=“name”)字符串名){
JsonGraph结果=新的JsonGraph(){
@凌驾
受保护的JsonGraph self(){
归还这个;
}
};
try(事务tx=database.beginTx()){
节点person=database.findNode(标签(“person”),“name”,name);
if(person==null){
抛出new NotFoundException();//最终转换为404
}
addNode(person,包括onlynamodetransformer.INSTANCE);
for(关系worksFor:person.getRelationships(with name(“WORKS_for”)、Direction.OUTGOING)){
结果.添加关系(worksFor);
addNode(worksFor.getEndNode(),IncludeOnlyNameNodeTransformer.INSTANCE);
}
成功();
}
返回结果;
}
私有静态最终类IncludeOnlyNameNodeTransformer实现NodeTransformer{
私有静态最终IncludeOnlyNameNodeTransformer实例=新IncludeOnlyNameNodeTransformer();
专用IncludeOnlyNameNodeTransformer(){
}
@凌驾
公共LongIdJsonNode变换(节点节点){
返回新的LongIdJsonNode(节点,新字符串[]{“name”});
}
}
}
运行此测试

public类ApiExampleTest扩展了graphhareapitest{
@凌驾
受保护的void填充数据库(GraphDatabaseService数据库){
执行(“在:Person(name)上创建索引”);
数据库.execute(“CREATE(:Person{name:'Michal',age:32})-[:WORKS_FOR{since:2013}]>(:Company{name:'GraphAware',est:2013});
}
@试验
public void testExample(){
System.out.println(httpClient.get(baseUrl()+“/person/Michal/”,200));
}
}
将返回以下JSON

{
  "nodes": [
    {
      "properties": {
        "name": "GraphAware"
      },
      "labels": [
        "Company"
      ],
      "id": 1
    },
    {
      "properties": {
        "name": "Michal"
      },
      "labels": [
        "Person"
      ],
      "id": 0
    }
  ],
  "relationships": [
    {
      "properties": {
        "since": 2013
      },
      "type": "WORKS_FOR",
      "id": 0,
      "startNodeId": 0,
      "endNodeId": 1
    }
  ]
}
看看这本书。您可以直接在Neo4j(相同的JVM)上构建api,但必须使用Cypher、Java或Scala

我会从塞弗开始,因为你可以写得很快