使用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"}]}}
我试图建立两种失败的关系:
{"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作为列表,但它没有用。
感谢您的帮助
答案 0 :(得分:5)
请确保始终使用cypher查询中的参数
使用rest-batch-operations执行多个查询,请参阅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
} ]
答案 1 :(得分:0)
我以前使用“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,您可以查看以下网址:http://docs.neo4j.org/chunked/1.8/rest-api.html
答案 2 :(得分:0)
我尝试使用Muhammad Osman解决方案并构建一个适合我的查询,但我在REST API中遇到另一个错误。
我试过的查询是:
{" query":" START n = node:node_auto_index(' UserId:21000001'),m = node:node_auto_index(' UserId:21000002&# 39;)创建独特的n- [r:知道{标签:'朋友'}] - m START n1 = node:node_auto_index(' UserId:21000003'),m1 = node:node_auto_index (' UserId:21000005')创建独特的n1- [r1:知道{标签:'关注'}] - m1"," params":{} }
它给我的错误是:
{ " message":"字符串匹配正则表达式
$' expected but
S'发现\ n \ n想知道我们应该有更好的错误信息吗?通过发送此查询到cypher@neo4j.org来帮助我们。\ n \ n谢谢你,Neo4j团队。\ n \ n \" 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(&# 39; UserId:21000003'),m1 = node:node_auto_index(' UserId:21000005')CREATE UNIQUE n1- [r1:KNOWS {标签:'关注'}] - m1 \" \ n ^", " exception":" SyntaxException", " stacktrace":[...] }
据我所知,Cypher希望查询在第一个CREATE UNIQUE之后结束。但是Cypher允许我们在一个Cypher中进行多次创建。为什么不多个CREATE UNIQUE?
答案 3 :(得分:0)
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