Execute multiple CREATE UNIQUE in one cypher query through Rest API
使用 Neo4j 1.8.1 版本,我尝试使用"cypher"REST 入口点插入许多关系(查询必须插入关系,并且仅在必要时插入目标节点)。我通过 http://christophewillemsen.com/streemz/8/importing-initial-data-with-the-neo4j-rest-api 博客文章发现了这种可能性。
如果我只创建一个关系,它工作得很好,但一旦我尝试几个,它就会失败。
用于调用一种有效关系的 JSON:
1 | {"query":"START n=node:node_auto_index(UserId='21000001') CREATE UNIQUE n-[:KNOWS{Label:'Friend'}]-(m{Users})","params":{"Users" : [{"UserId":"21000003"}]}} |
我试图建立的 2 关系失败了:
1 | {"query":"START n=node:node_auto_index(UserId='21000001') CREATE UNIQUE n-[:KNOWS{Label:'Friend'}]-(m{Users})","params":{"Users" : [{"UserId":"21000002"},{"UserId":"21000003"}]}} |
REST 调用返回的错误是:
1 2 3 4 5 | { "message":"The pattern CreateUniqueAction(List(m-[:`LOVES`]-n)) produced multiple possible paths, and that is not allowed", "exception":"UniquePathNotUniqueException", "stacktrace":"..." } |
不知道我的查询是如何在 Neo4j 中准确转换的,很难找到我必须如何更改我的查询。
我以为 Neo4j 会做 2 次查询,但由于错误,它似乎正在为另一个节点端做某种 IN 语句。
我也尝试将参数设置为列表,但没有成功。
感谢您的帮助
请确保在密码查询中始终使用参数
使用 rest-batch-operations 执行多个查询,请参阅 http://docs.neo4j.org/chunked/milestone/rest-api-batch-ops.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | POST `http://localhost:7474/db/data/batch` Accept: application/json Content-Type: application/json [ { "method" :"POST", "to" :"/cypher", "body" : { "query" :"START n=node:node_auto_index(UserId={userId1}), m=node:node_auto_index(UserId={userId2}) CREATE UNIQUE n-[r:KNOWS{Label:{label}}]-m", "params" : {"userId1":"21000001","userId2":"21000002","label":"Friend"} }, "id" : 0 }, { "method" :"POST", "to" :"/cypher", "body" : { "query" :"START n=node:node_auto_index(UserId={userId1}), m=node:node_auto_index(UserId={userId2}) CREATE UNIQUE n-[r:KNOWS{Label:{label}}]-m", "params" : {"userId1":"21000003","userId2":"21000005","label":"Friend"} }, "id" : 1 } ] |
你试过了吗
1 2 3 | START n=node:node_auto_index('UserId:21000001'),m=node:node_auto_index('UserId:21000002'), n1=node:node_auto_index('UserId:21000003'),m1=node:node_auto_index('UserId:21000005') CREATE UNIQUE n-[r:KNOWS{Label:'Friend'}]-m ,n1-[r1:KNOWS{Label:'Follow'}]-m1 |
我尝试使用 Muhammad Osman 解决方案并构建一个适合我的查询,但在 REST API 中遇到另一个错误。
我尝试的查询是:
{"query":"START n=node:node_auto_index('UserId:21000001'), m=node:node_auto_index('UserId:21000002') CREATE UNIQUE n-[r:KNOWS{Label:'Friend'}]-m START n1=node:node_auto_index('UserId:21000003'), m1=node:node_auto_index('UserId:21000005') CREATE UNIQUE n1-[r1:KNOWS{Label:'Follow'}]-m1","params":{}}
它给我的错误是:
{
"message":"string matching regex$' expected but S' found\
\
Think we should have better error message here? Help us by sending this query to [email protected].\
\
Thank you, the Neo4j Team.\
\
"START n=node:node_auto_index('UserId:21000001'), m=node:node_auto_index('UserId:21000002') CREATE UNIQUE n-[r:KNOWS{Label:'Friend'}]-m START n1=node:node_auto_index('UserId:21000003'), m1=node:node_auto_index('UserId:21000005') CREATE UNIQUE n1-[r1:KNOWS{Label:'Follow'}]-m1"\
^",
"exception":"SyntaxException",
"stacktrace": [...]
}
据我了解,Cypher 期望查询在第一个 CREATE UNIQUE 之后结束。然而,Cypher 允许我们在一个 Cypher 中执行多个 CREATE 为什么。为什么不使用多个 CREATE UNIQUE ?
我曾经使用"密码查询语言"而不是 REST API。
我会做你想做的事情:
1 2 3 | START n=node:node_auto_index('UserId:21000001'),m=node:node_auto_index('UserId:21000002 OR UserId:21000003') CREATE UNIQUE n-[r:KNOWS{Label:'Friend'}]-m RETURN r |
您可以查看:http://docs.neo4j.org/chunked/1.8/cypher-query-lang.html
对于 Rest API,您可以查看以下 URL:http://docs.neo4j.org/chunked/1.8/rest-api.html