通过 Neo4j rest api 发送的数据不会持久化
Data sent via Neo4j rest api does not get persisted
我正在使用 Neo4j rest api 创建具有更多节点和关系的图形结构。我使用以下密码查询格式在单个 post 请求中发送一批节点及其关系。
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 没有写入图形数据库中的文件?任何帮助将不胜感激。
来自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
这是使用 jersey 客户端发送到 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)"}
我被 REST 上下文打扰了,实际上查询在任何上下文中都不起作用(REST API、Neo4j 浏览器、neo4j-shell 等)。
根据所有文件的大小,数据库中没有任何关系或节点。您的查询从匹配节点开始:因为没有任何节点,所以永远不会执行 CREATE
子句。
要创建尚不存在的节点,然后创建关系,您需要在 name
属性 上为该标签使用 MERGE
instead of MATCH
. You should also set a label on the nodes, and for performance and correctness, create a 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 子句,即使您手动批量配对,它也可以比远程查询更快地导入数据?
我正在使用 Neo4j rest api 创建具有更多节点和关系的图形结构。我使用以下密码查询格式在单个 post 请求中发送一批节点及其关系。
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 没有写入图形数据库中的文件?任何帮助将不胜感激。
来自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
这是使用 jersey 客户端发送到 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)"}
我被 REST 上下文打扰了,实际上查询在任何上下文中都不起作用(REST API、Neo4j 浏览器、neo4j-shell 等)。
根据所有文件的大小,数据库中没有任何关系或节点。您的查询从匹配节点开始:因为没有任何节点,所以永远不会执行 CREATE
子句。
要创建尚不存在的节点,然后创建关系,您需要在 name
属性 上为该标签使用 MERGE
instead of MATCH
. You should also set a label on the nodes, and for performance and correctness, create a 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 子句,即使您手动批量配对,它也可以比远程查询更快地导入数据?