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



使用Neo4j版本1.8.1,我试图利用"cypher" REST入口点插入许多关系(查询必须插入关系,只有在必要时才插入目标节点)。我是通过http://christophewillemsen.com/streemz/8/importing-initial-data-with-the-neo4j-rest-api的一篇博文发现这种可能性的。

如果我只创建一个关系,它工作得很好,但当我尝试多个关系时,它就失败了。

用于调用一个正在工作的关系的JSON:

{"query":"START n=node:node_auto_index(UserId='21000001') CREATE UNIQUE n-[:KNOWS{Label:'Friend'}]-(m{Users})", "params":{"Users" : [{"UserId":"21000003"}]}}

我试图建立2种失败的关系:

{"query":"START n=node:node_auto_index(UserId='21000001') CREATE UNIQUE n-[:KNOWS{Label:'Friend'}]-(m{Users})", "params":{"Users" : [{"UserId":"21000002"},{"UserId":"21000003"}]}}
REST调用返回的错误是:
{
    "message": "The pattern CreateUniqueAction(List(m-[:`LOVES`]-n)) produced multiple possible paths, and that is not allowed",
    "exception": "UniquePathNotUniqueException",
    "stacktrace": "..."
}

不知道我的查询是如何在Neo4j内转换的,很难找到我必须如何改变我的查询。

我认为Neo4j会做2个查询,但错误似乎是它正在为其他节点端做一种IN语句。

我也试过把params作为一个列表,但是没有成功。

谢谢你的帮助

请确保在密码查询中始终使用参数

使用rest-批处理操作执行多个查询,参见http://docs.neo4j.org/chunked/milestone/rest-api-batch-ops.html

   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
   } ]

我曾经使用"Cypher查询语言"而不是REST API。然后我做你想做的事情,像这样:

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

我尝试使用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":{}}

它给我的错误是:

{"消息":"字符串匹配的正则表达式$' expected but S'发现nn认为我们应该有更好的错误信息在这里?帮助我们发送这个查询到cypher@neo4j.org.n n谢谢你,Neo4j团队。nn"START n=node:node_auto_index('UserId:21000001'), m=node:node_auto_index('UserId: 21000003') 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"n ^","异常":"SyntaxException","加":[…]}

根据我的理解,Cypher期望查询在第一个CREATE UNIQUE之后结束。然而,Cypher允许我们在一个Cypher中执行多个CREATE。

你试过了吗

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

最新更新