java neo4j

在第1部分中 ,我们讨论了使用Java REST绑定建立与Neo4j Server的连接。 现在让我们详细了解事务,批处理以及REST请求的实际情况。确保org.neo4j.rest.logging_filter to true) as described in Part 1打开日志记录(将系统属性org.neo4j.rest.logging_filter to true) as described in Part 1设置org.neo4j.rest.logging_filter to true) as described in Part 1

我们将更改代码以执行这些Neo4j API调用。

范例1:

Transaction tx = graphDb.beginTx();Map props=new HashMap();props.put("id", 100);props.put("name","firstNode");Node node=graphDb.createNode(props);props.put("id",200);props.put("name","secondNode");Node node2=graphDb.createNode(props);node.createRelationshipTo(node2, DynamicRelationshipType.withName("KNOWS"));tx.success();tx.finish();result=engine.query("start n=node(*) return count(n) as total", Collections.EMPTY_MAP);Iterator iterator=result.iterator();if(iterator.hasNext()) {Map row= iterator.next();out.print("Total nodes: " + row.get("total"));}

检查日志(对我来说,它们默认显示在Tomcat控制台上),然后查找REST调用。 上面的代码产生了:

INFO: 1 * Client out-bound request
1 >  POST http://localhost:7474/db/data/node
1 >  Accept: application/json; stream=true
1 >  X-Stream: true
1 >  Content-Type: application/json
1 >
{"id":100,"name":"firstNode"}INFO: 1 * Client in-bound response
1 < 201
1 < Access-Control-Allow-Origin: *
1 < Transfer-Encoding: chunked
1 < Content-Encoding: UTF-8
1 < Location: http://localhost:7474/db/data/node/1
1 < Content-Type: application/json; stream=true
1 < Server: Jetty(6.1.25)
1 <
{"extensions":{},"paged_traverse":"http://localhost:7474/db/data/node/1/paged/traverse/{returnType}{?pageSize,leaseTime}","outgoing_relationships":"http://localhost:7474/db/data/node/1/relationships/out","traverse":"http://localhost:7474/db/data/node/1/traverse/{returnType}","all_typed_relationships":"http://localhost:7474/db/data/node/1/relationships/all/{-list|&|types}","property":"http://localhost:7474/db/data/node/1/properties/{key}","all_relationships":"http://localhost:7474/db/data/node/1/relationships/all","self":"http://localhost:7474/db/data/node/1","properties":"http://localhost:7474/db/data/node/1/properties","outgoing_typed_relationships":"http://localhost:7474/db/data/node/1/relationships/out/{-list|&|types}","incoming_relationships":"http://localhost:7474/db/data/node/1/relationships/in","incoming_typed_relationships":"http://localhost:7474/db/data/node/1/relationships/in/{-list|&|types}","create_relationship":"http://localhost:7474/db/data/node/1/relationships","data":{"name":"firstNode","id":100}}INFO: 2 * Client out-bound request
2 > POST http://localhost:7474/db/data/node
2 > Accept: application/json; stream=true
2 > X-Stream: true
2 > Content-Type: application/json
2 >
{"id":200,"name":"secondNode"}INFO: 2 * Client in-bound response
2 < 201
2 < Access-Control-Allow-Origin: *
2 < Transfer-Encoding: chunked
2 < Content-Encoding: UTF-8
2 < Location: http://localhost:7474/db/data/node/2
2 < Content-Type: application/json; stream=true
2 < Server: Jetty(6.1.25)
2 <
{"extensions":{},"paged_traverse":"http://localhost:7474/db/data/node/2/paged/traverse/{returnType}{?pageSize,leaseTime}","outgoing_relationships":"http://localhost:7474/db/data/node/2/relationships/out","traverse":"http://localhost:7474/db/data/node/2/traverse/{returnType}","all_typed_relationships":"http://localhost:7474/db/data/node/2/relationships/all/{-list|&|types}","property":"http://localhost:7474/db/data/node/2/properties/{key}","all_relationships":"http://localhost:7474/db/data/node/2/relationships/all","self":"http://localhost:7474/db/data/node/2","properties":"http://localhost:7474/db/data/node/2/properties","outgoing_typed_relationships":"http://localhost:7474/db/data/node/2/relationships/out/{-list|&|types}","incoming_relationships":"http://localhost:7474/db/data/node/2/relationships/in","incoming_typed_relationships":"http://localhost:7474/db/data/node/2/relationships/in/{-list|&|types}","create_relationship":"http://localhost:7474/db/data/node/2/relationships","data":{"name":"secondNode","id":200}}INFO: 3 * Client out-bound request
3 > POST http://localhost:7474/db/data/node/1/relationships
3 > Accept: application/json; stream=true
3 > X-Stream: true
3 > Content-Type: application/json
3 >
{"to":"http://localhost:7474/db/data/node/2","type":"KNOWS"}INFO: 3 * Client in-bound response
3 < 201
3 < Access-Control-Allow-Origin: *
3 < Transfer-Encoding: chunked
3 < Content-Encoding: UTF-8
3 < Location: http://localhost:7474/db/data/relationship/0
3 < Content-Type: application/json; stream=true
3 < Server: Jetty(6.1.25)
3 <
{"extensions":{},"start":"http://localhost:7474/db/data/node/1","property":"http://localhost:7474/db/data/relationship/0/properties/{key}","self":"http://localhost:7474/db/data/relationship/0","properties":"http://localhost:7474/db/data/relationship/0/properties","type":"KNOWS","end":"http://localhost:7474/db/data/node/2","data":{}}INFO: 4 * Client out-bound request
4 > POST http://localhost:7474/db/data/cypher
4 > Accept: application/json; stream=true
4 > X-Stream: true
4 > Content-Type: application/json
4 >
{"query":"start n=node(*) return count(n) as total","params":{}}INFO: 4 * Client in-bound response
4 < 200
4 < Access-Control-Allow-Origin: *
4 < Transfer-Encoding: chunked
4 < Content-Encoding: UTF-8
4 < Content-Type: application/json; stream=true
4 < Server: Jetty(6.1.25)
4 <
{"columns":["total"],"data":[[3]]}

网上总共有4个REST调用,用于那段很小的代码。 您绝对希望尽可能避免这种情况。 选项1是尽可能使用Cypher。 通过不使用嵌入式样式API并切换到Cypher,我们可以将前三个REST调用转换为一个。

范例2:

Map<String,Object> props=new HashMap<String, Object>();props.put("id", 100);props.put("name","firstNode");Map<String,Object> props2=new HashMap<String, Object>();props2.put("id",200);props2.put("name","secondNode");Map<String,Object> params=new HashMap<String, Object>();params.put("props1",props);params.put("props2",props2);engine.query("create (n1 {props1})-[:KNOWS]->(n2 {props2})", params);

这将产生:

1 > POST http://localhost:7474/db/data/cypher
{"query":"create (n1 {props1})-[:KNOWS]->(n2 {props2})","params":{"props1":{"id":100,"name":"firstNode"},"props2":{"id":100,"name":"firstNode"}}}Jul 24, 2013 10:38:47 PM com.sun.jersey.api.client.filter.LoggingFilter log
INFO: 1 * Client in-bound response
1 < 200
1 < Access-Control-Allow-Origin: *
1 < Transfer-Encoding: chunked
1 < Content-Encoding: UTF-8
1 < Content-Type: application/json; stream=true
1 < Server: Jetty(6.1.25)
1 <
{"columns":[],"data":[]}

批处理事务中的所有操作

https://github.com/neo4j/java-rest-binding上的文档指出:

“在1.8中,它尝试将tx中的所有操作收集为批处理操作,然后将在服务器上执行该批处理操作。 这暗示着在“ tx”中检索到的结果不是立即可用的,而是仅在调用tx.success和tx.finish之后才可用。

但是,请注意,这不是从示例1中看到的默认行为。要启用此功能,需要设置以下系统属性: org.neo4j.rest.batch_transaction=true

设置系统属性并重新运行示例1后,REST调用将如下所示(仅请求):

INFO: 1 * Client out-bound request
1 > POST http://localhost:7474/db/data/batch
1 > Accept: application/json; stream=true
1 > X-Stream: true
1 > Content-Type: application/json
1 >
[{"id":1,"to":"node","body":{"id":200,"name":"secondNode"},"method":"POST"},{"id":2,"to":"node","body":{"id":200,"name":"secondNode"},"method":"POST"},{"id":3,"to":"{1}/relationships","body":{"to":"{2}","type":"KNOWS"},"method":"POST"}]INFO: 2 * Client out-bound request
2 > POST http://localhost:7474/db/data/cypher
2 > Accept: application/json; stream=true
2 > X-Stream: true
2 > Content-Type: application/json
2 >
{"query":"start n=node(*) return count(n) as total","params":{}}

您还可以显式创建批处理操作,如下所示:

List<Node> response =graphDb.executeBatch(new BatchCallback<List<Node>>() {@Overridepublic List<Node> recordBatch(RestAPI batchRestApi) {List<Node> nodes=new ArrayList<Node>();Map props=new HashMap<String, Object>();props.put("id",600);nodes.add(batchRestApi.createNode(props));Map props2=new HashMap<String, Object>();props2.put("id",500);nodes.add(batchRestApi.createNode(props2));return nodes;}});

转换为:

INFO: 1 * Client out-bound request
1 > POST http://localhost:7474/db/data/batch
1 > Accept: application/json; stream=true
1 > X-Stream: true
1 > Content-Type: application/json
1 >
[{"id":1,"to":"node","body":{"id":600},"method":"POST"},{"id":2,"to":"node","body":{"id":500},"method":"POST"}]

强烈建议在较细粒度的Neo4j Java API上使用任何Cypher / Batching方法。 在最后一篇文章中,我们将了解事务在REST绑定的上下文中的行为。

参考: Neo4j Java REST绑定–我们JCG合作伙伴 Luanne Misquitta的第2部分(批处理),来自Thought Bytes博客。

翻译自: https://www.javacodegeeks.com/2013/08/neo4j-java-rest-binding-part-2-batching.html

java neo4j

java neo4j_Neo4j Java REST绑定–第2部分(批处理)相关推荐

  1. JOGL - Java与OpenGl的绑定(转)

    JOGL - Java与OpenGl的绑定 默认分类 2009-11-22 20:31:05 阅读4 评论0 字号:大中小 在这篇文章里,摘录了<学习Java对于OpenGl的绑定>.作者 ...

  2. cassandra 数据到Java对象的映射绑定

    类似Hibernate和MyBatis的关系映射,自动帮你将查询数据或是修改的参数进行数据映射和绑定. 支持查询后返回数据ResultSet到Java对象的映射,支持修改.删除.查询之前参数的绑定. ...

  3. java对opengl绑定_你好,JOGL - Java与OpenGl的绑定-Java频道-中国IT实验室

    然后出现了JOGL 也许是最流行的真正的面向对象的编程语言.有许多用去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGl的绑定(Java Bindings for Open ...

  4. java实现app微信绑定功能

    在 Java 中实现微信绑定功能,需要使用微信开放平台提供的相关接口和 SDK. 首先,你需要在微信开放平台上注册开发者帐号,并创建应用.然后,你需要在应用中获取 AppID 和 AppSecret, ...

  5. java neo4j_Neo4j基本入门

    Neo4j基本入门 Javaneo4j Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是 ...

  6. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  7. 做了6年的Java,java视频教程传智播客

    JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...

  8. java与java ee_Java EE MVC:处理表单验证

    java与java ee 在本文中,我们将介绍Java EE MVC中的表单验证. Java EE MVC与Java Bean验证API( JSR 303 )集成在一起,这使得添加验证约束变得非常容易 ...

  9. java与java ee_Java EE拦截器

    java与java ee 历史 我认为重要的是要看一下Java EE中Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变成一个单独的规范,现在可供其他Java EE规范扩展,这 ...

最新文章

  1. 寻找连通域算法_【车牌识别算法】
  2. Science:亚硝酸盐氧化细菌在黑暗海洋中的主要作用
  3. 惨淡!苏州楼市政策调控下,这些房企高调入驻,如今黯然离场?
  4. 关于Beta分布、二项分布与Dirichlet分布、多项分布的关系
  5. DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3、MobileNet、InceptionV3、VGG系列、ResNet、Mask R-CNN )下载地址集合(持续更新)
  6. MySQL—修改、删除数据(一)
  7. Idea——Tomcat 报错——Warning: No artifacts configured 解决方法
  8. shell 数组操作
  9. 火狐和chrome_Firefox,Chrome和Edge都将支持WebAuthn的硬件两因素身份验证
  10. c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...
  11. HDU 5600(瞎搞)
  12. vuejs 指令封装 button 加载效果_这些Vue自定义指令,让你的项目开发爽到爆
  13. jsp EL表达式比较时间
  14. 友商惭愧不?2000+的手机红米直接干到千元
  15. 深度评测阿里云、百度云、腾讯云和华为云
  16. vue2.0 之事件处理器
  17. 场景能量初显,这里有小程序的11个新发现(附2018年7月微信小程序TOP100榜单暨研究报告)...
  18. 双击IE出现打开方式解决办法
  19. 微信小程序点餐页面实现完整版
  20. 解决谷歌浏览器最新chrome94版本CORS跨域问题(海康视频插件无法播放的问题)

热门文章

  1. 【Python】Scrapy的安装与使用
  2. .net三层架构开发步骤
  3. 使用JDBCTemplate实现与Spring结合,方法公用 ——Spring配置(applicationContext.xml)
  4. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)
  5. java后台 flex前台例子_flex+blazeds+java后台消息推送(简单示例)
  6. window location href 手机端无法跳转_Window对象在前端领域的角色
  7. 端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)
  8. Mac 环境变量配置
  9. java switch语句_Java 14:查看更新的switch语句
  10. openj9下载_Quarkus on OpenJ9 JVM和资源消耗