1

我正在使用 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 大小。此外du -hc *store.db*,graph.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)"}
4

1 回答 1

0

我被 REST 上下文跟踪了,实际上查询在任何上下文(REST API、Neo4j 浏览器、neo4j-shell 等)中都不起作用。

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

要创建尚不存在的节点,然后创建关系,您需要使用MERGE而不是MATCH. 您还应该在节点上设置一个标签,并且为了性能和正确性,为该标签的属性创建一个唯一性约束name(它将同时创建一个索引):

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 CSVCypher 子句,它可以比远程查询更快地导入数据,即使您手动批量配对?

于 2016-11-25T08:55:24.940 回答