Проверить из 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
}
]
}
Что означает «выставлять определенные части»? Каковы ваши варианты использования? Кто использует биты, которые вы раскрываете, что делать? – FrobberOfBits
Итак, скажем, мы говорим о базе данных «Кино», я, возможно, не хочу раскрывать все подробности о фильмах и актерах, но только такие вещи, как следующее: 1. Имена участников 2. Названия фильмов 3. Друг друзей для актеры. – panache
есть несколько драйверов, которые помогут вам построить 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