我正在使用Neo4j rest api来创建具有更多节点和关系的图形结构。我使用以下cypher查询格式在一个帖子请求中发送一批节点及其关系。
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 :(得分:0)
我被REST上下文跟踪,实际上查询在任何上下文中都不起作用(REST API,Neo4j浏览器,neo4j-shell等)。
根据所有文件的大小,数据库中没有或节点的任何关系。您的查询首先在节点上匹配:因为没有任何内容,所以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子句,即使您手动批量配对,也可以比远程查询更快地导入数据?