关于 neo4j:通过 Rest API 在一个密码查询中执行多个 CREATE UNIQUE

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 butS' 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