2013-03-24 49 views
3

使用Neo4j版本1.8.1,我试图利用“密码”REST入口点来插入许多关系(查询必须插入关系,如果需要的话,目标节点)。我通过http://christophewillemsen.com/streemz/8/importing-initial-data-with-the-neo4j-rest-api博客文章发现了这种可能性。通过Rest API在一个密码查询中执行多个CREATE UNIQUE

如果我只创建一个关系,但只要我尝试了几次就失败了。

的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 Retunred错误请拨打:

{ 
    "message": "The pattern CreateUniqueAction(List(m-[:`LOVES`]-n)) produced multiple possible paths, and that is not allowed", 
    "exception": "UniquePathNotUniqueException", 
    "stacktrace": "..." 
} 

不知道我的查询究竟如何在Neo4中转换j很难找到我必须改变我的查询。

我认为Neo4j会做2个查询,但由于错误,它似乎在为另一个节点端做一种IN语句。

我也尝试使PARAMS作为列表,但它没有奏效。

谢谢您的帮助

回答

5

请务必使用参数暗号查询所有的时间

使用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 
    } ] 
+0

它似乎回答我的问题。我会在今天早上尝试验证。 – 2013-03-26 06:27:22

+0

没关系,它允许我以正确的性能正确地打我的数据库到我的数据库(1000到2秒到4秒创建unqiue查询)。 – 2013-03-26 10:44:48

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

+0

谢谢,它确实可以是一种解决方案,但它不能解决一种情况,即当我希望CREATE UNIQUE创建两个关系和结束节点。用你的语法,如果用户21000002不存在,它将不会被创建。 – 2013-03-24 19:33:52

0

我试图用穆罕默德·奥斯曼·解决方案并构建一个适合我的查询,但我在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\n\nThink we should have better error message here? Help us by sending this query to [email protected]\n\nThank you, the Neo4j Team.\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('UserId:21000003'), m1=node:node_auto_index('UserId:21000005') CREATE UNIQUE n1-[r1:KNOWS{Label:'Follow'}]-m1\"\n ^", "exception": "SyntaxException", "stacktrace": [...] }

从我了解的Cypher是expectinq查询中的第CREATE UNIQUE后结束。然而Cypher允许我们在一个Cypher中做多个CREATE为什么。为什么不使用多个CREATE UNIQUE?

+0

你可以在console.neo4j.org重新创建这个文件并提交一个错误? – 2013-03-26 12:46:11

+0

嗨,我试图重现这一点,但似乎我不能在console.neo4j.org做一个CREATE UNIQUE。它说'错误:java.lang.RuntimeException:我需要一个事务!' – 2013-03-27 08:28:02

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 
+0

我没有试过,语法没问题。然而它并没有做我所需要的,也就是:我不知道节点是否存在,这就是为什么我把它放在开始声明中。但是我的一个START节点不存在,CREATE UNIQUE不会插入任何东西。即使其中一个CREATE UNIQUE语句是正确的。 – 2013-03-27 08:43:28