2016-01-27 3 views
0

У меня есть огромная база данных Neo4j, которую я создал с помощью инструмента пакетного импорта. Теперь я хочу показать некоторые части данных через API (которые будут запускать запрос в бэкэнд) для моих пользователей. Мои требования довольно общие:
1. Задержка должна быть не менее
2. Поддержка qps около ~ 10-20.Создание API для доступа к данным Neo4j

Может кто-нибудь дать мне рекомендации относительно того, что я должен использовать для этого и любой документации о том, как это сделать? Я вижу несколько примеров рубинов/рельсов и API REST - однако они являются специфическими для раскрытия данных, как без каких-либо сложных запросов в бэкэнд. Я не уверен, как перевести это в конкретные API, которые я хочу. Любая помощь будет оценена по достоинству.

Спасибо.

+1

Что означает «выставлять определенные части»? Каковы ваши варианты использования? Кто использует биты, которые вы раскрываете, что делать? – FrobberOfBits

+0

Итак, скажем, мы говорим о базе данных «Кино», я, возможно, не хочу раскрывать все подробности о фильмах и актерах, но только такие вещи, как следующее: 1. Имена участников 2. Названия фильмов 3. Друг друзей для актеры. – panache

+0

есть несколько драйверов, которые помогут вам построить API: http://neo4j.com/developer/language-guides/. Вы также можете попасть в транзакционную конечную точку resto apo Neo4j, как описано здесь: http://neo4j.com /docs/stable/rest-api-transactional.html Поскольку я хотел преобразовать возвращаемые данные, я написал пакет npm для nodejs: https://www.npmjs.com/package/cypher-rest Надеюсь, это поможет отправная точка. – manonthemat

ответ

0

Очевидно, что вы можете использовать свои собственные каркасы, такие как Rails/Sinatra. Если вы хотите стандарт таким образом, что ваш API отформатирован я совсем как стандарт API JSON:

http://jsonapi.org/

Вот эпизод The ​​Changelog подкасте говорить об этом:

https://changelog.com/189/

Существует также драгоценный камень для создания ресурсных объектов, которые определяют, что выставляется, а что нет:

https://github.com/cerebris/jsonapi-resources

Я немного попробовал его с жемчужиной neo4j, и он работает на базовом уровне, хотя после того, как вы начинаете входить в include, похоже, есть некоторые зависимости от ActiveRecord. Я бы хотел, чтобы такие проблемы сработали.

Вы также можете проверить стандарт GraphQL, который был создан с помощью Facebook:

https://github.com/facebook/graphql

Там в драгоценный камень рубин для него:

https://github.com/rmosolgo/graphql-ruby

И, конечно же, еще один эпизод Перечня;)

http://5by5.tv/changelog/149

Различные другие ресурсы API для Ruby:

https://github.com/webmachine/webmachine-ruby https://github.com/ruby-grape/grape

0

Я написал простой пример КОЛБУ API, который взаимодействует с Neo4j для простой демонстрации (бэкэндом для обмена сообщениями IOS приложение).

Вы могли бы найти полезные ссылки: https://github.com/johnymontana/messages-api

Есть также несколько ресурсов онлайн для использования колбы с Neo4j:

1

Проверить из GraphAware Framework. Вы можете создавать API непосредственно поверх Neo4j (тот же JVM), но вы должны использовать Cypher, Java или Scala.

Я бы начал с Cypher, потому что вы можете написать его очень быстро, а затем оптимизировать для производительности, и, наконец, если все остальное не работает, и ваша латентность по-прежнему высока, конвертируйте в Java.

Вы можете легко подобрать подграфы (или даже частично гидратированные узлы и отношения, т. Е. Только определенные свойства). Оформить заказ в пакете api. Пример кода:

Вы бы написать контроллер для возврата графа человека, но только включают в себя имена узлов связи (не возраст или что-нибудь еще):

@RestController 
public class ApiExample { 

    private final GraphDatabaseService database; 

    @Autowired 
    public ApiExample(GraphDatabaseService database) { 
     this.database = database; 
    } 

    @RequestMapping(path = "person/{name}") 
    public JsonGraph getPersonGraph(@PathVariable(value = "name") String name) { 
     JsonGraph<?> result = new JsonGraph() { 
      @Override 
      protected JsonGraph self() { 
       return this; 
      } 
     }; 

     try (Transaction tx = database.beginTx()) { 
      Node person = database.findNode(label("Person"), "name", name); 

      if (person == null) { 
       throw new NotFoundException(); //eventually translate to 404 
      } 

      result.addNode(person, IncludeOnlyNameNodeTransformer.INSTANCE); 

      for (Relationship worksFor : person.getRelationships(withName("WORKS_FOR"), Direction.OUTGOING)) { 
       result.addRelationship(worksFor); 
       result.addNode(worksFor.getEndNode(), IncludeOnlyNameNodeTransformer.INSTANCE); 
      } 

      tx.success(); 
     } 

     return result; 
    } 

    private static final class IncludeOnlyNameNodeTransformer implements NodeTransformer<LongIdJsonNode> { 

     private static final IncludeOnlyNameNodeTransformer INSTANCE = new IncludeOnlyNameNodeTransformer(); 

     private IncludeOnlyNameNodeTransformer() { 
     } 

     @Override 
     public LongIdJsonNode transform(Node node) { 
      return new LongIdJsonNode(node, new String[]{"name"}); 
     } 
    } 
} 

Запуск этого теста

public class ApiExampleTest extends GraphAwareApiTest { 

    @Override 
    protected void populateDatabase(GraphDatabaseService database) { 
     database.execute("CREATE INDEX ON :Person(name)"); 
     database.execute("CREATE (:Person {name:'Michal', age:32})-[:WORKS_FOR {since:2013}]->(:Company {name:'GraphAware', est:2013})"); 
    } 

    @Test 
    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 
    } 
    ] 
} 
+0

Спасибо. Я попробую это. – panache

0

Использовать grest.

Вы можете просто определить свою основную модель (ы) и ее отношения (как вторичные) и построить API с минимальным кодированием и как можно быстрее!

Смежные вопросы