2016-11-24 48 views
1

我正在使用Neo4j rest api创建一个具有更多节点和关系的图结构。我使用以下密码查询格式在单个发布请求中发送一批节点及其关系。通过Neo4j rest api发送的数据不会持久

UNWIND [[0,1], [0,6309]] AS pair 
MATCH (n {name: pair[0]}), (m {name: pair[1]}) 
CREATE (n)-[:X]->(m) 

我从1GB大小的文件中读取数据,并上传数据分批到Neo4j的。我发送的所有请求的响应码为200,但当我检查{$NEO4J_HOME}/data/databases/graph.db大小时,它只显示244K大小。 graph.db中的du -hc *store.db*命令显示所有nodestore.db,relationshipstore.db和propertystore.db大小均为0.为什么通过rest api上载的数据没有写入图形DB中的文件?任何帮助将不胜感激。从du -hc *store.db*

0  neostore.nodestore.db 
4.0K neostore.nodestore.db.id 
8.0K neostore.nodestore.db.labels 
4.0K neostore.nodestore.db.labels.id 
0  neostore.propertystore.db 
8.0K neostore.propertystore.db.arrays 
4.0K neostore.propertystore.db.arrays.id 
4.0K neostore.propertystore.db.id 
8.0K neostore.propertystore.db.index 
4.0K neostore.propertystore.db.index.id 
8.0K neostore.propertystore.db.index.keys 
4.0K neostore.propertystore.db.index.keys.id 
0  neostore.relationshipstore.db 

输出这是发送使用球衣客户端的Neo4j REST API完整的请求。

Client client = Client.create(); 
client.addFilter(new HTTPBasicAuthFilter(user, password)); 
WebResource cypherResource = client.resource("http://localhost:7474/db/data/cypher"); 
ClientResponse cypherResponse = cypherResource.accept(MediaType.APPLICATION_JSON) 
      .type(MediaType.APPLICATION_JSON_TYPE).entity(query).post(ClientResponse.class); 

样品查询设置为实体:

{"query":"UNWIND [[0,1], [0,6309]] AS pair 
MATCH (n {name: pair[0]}), (m {name: pair[1]}) CREATE (n)-[:X]->(m)"} 
+0

向我们展示发送给Neo4j的完整查询(方法,路径,标头,正文)。也许你从不承诺交易? –

+0

我已经用发送给Neo4j的完整查询更新了问题。谢谢你的帮助。 – sathya

回答

0

我被扯到了REST情况下,当实际的查询将不会在任何情况下工作(REST API,Neo4j的浏览器,neo4j-外壳等)。

根据所有文件的大小,数据库中没有任何关系或节点。您的查询从节点上匹配开始:因为没有任何,所以CREATE子句将永远不会执行。

要创建不存在的节点,然后是关系,您需要使用MERGE而不是MATCH。你也应该设定一个标签的节点上,而对于性能和正确性,对name属性,用于标签创建unicity constraint(将在同一时间创建索引):

CREATE CONSTRAINT ON (n:Node) ASSERT n.name IS UNIQUE; 

则:

UNWIND [[0,1], [0,6309]] AS pair 
MERGE (n:Node {name: pair[0]}) 
MERGE (m:Node {name: pair[1]}) 
CREATE (n)-[:X]->(m) 

(或者如果文件中可能存在重复对,则使用MERGE作为关系)。

您是否知道LOAD CSV Cypher子句,它可以比您的远程查询更快地导入数据,即使手动批量配对也是如此?

+0

感谢您的解决方案。我尝试了这种方法,它似乎正常工作。 neostore文件从我发送的数据中得到更新,并且我使用多个线程来批量并发地发布数据。然而,对于1GB大小的数据集,它需要将近3个小时,并且仍然在上传。 我知道'LOAD CSV'选项,但我必须使用其余api来比较neo4j与其他图形数据库的流动图表的性能。 – sathya