通过Neo4j浏览器提交多个分号分隔的Cypher语句

时间:2013-12-06 09:12:05

标签: neo4j cypher

我想通过网络浏览器提交一份分号分隔的Cypher写入语句列表,但我收到错误...

MERGE (a:user{id: 'A'}) 
MERGE (b:product{id: '1'}) 
CREATE UNIQUE (a)-[:USED_BY]->(b); 


MERGE (a:user{id: 'B'}) 
MERGE (b:product{id: '4'})  
CREATE UNIQUE (a)-[:USED_BY]->(b); 

我正在创建新节点并在后面的关系语句中引用它们,所以我想提交单独的查询而不是一个长的查询,我想通过Cypher这样做。

最好的方法是什么?

6 个答案:

答案 0 :(得分:8)

我在Multiple unrelated queries in Neo4j Cypher?

找到了解决方案

只需将WITH count(*) as dummy放在独立命令之间。

答案 1 :(得分:3)

现在有一个简单的设置可以执行此操作:Enable multi statement query editor

然后,您可以运行用分号;

分隔的多个语句

neo4j screenshot with the setting highlighted and result of both statements above

答案 2 :(得分:2)

这不是一个错误,而是预期的行为(截至撰写本文时,例如Neo4j 2.2及更早版本)。

Neo4j浏览器运行作为单个查询输入的每个命令,并显示该查询的结果。它不支持多个查询(或隐含的多组结果!)。

请注意,可以使用neo4j shell运行多个查询,正如您尝试的那样。每个单独命令的结果将写入stdout。示例在文档中:http://neo4j.com/docs/stable/shell-sample-session.html

答案 3 :(得分:0)

据我所知,不可能直接进行,但是如果你有python你可以安装py2neo然后使用一个非常简单的代码段,它使用了neo4j的REST api,即

from py2neo import cypher

session = cypher.Session("http://localhost:7474/db/data/")
tx = session.create_transaction()
cypher = [
    "MERGE (a:user{id: 'A'})"
    "MERGE (b:product{id: '1'})"
    "CREATE UNIQUE (a)-[:USED_BY]->(b)", #first statement 

    "MERGE (a:user{id: 'B'})" 
    "MERGE (b:product{id: '4'})"
    "CREATE UNIQUE (a)-[:USED_BY]->(b)" #second statement
] 

for q in cypher:
    tx.append(q)

tx.commit()

这将完成这项工作。

答案 4 :(得分:0)

将所有Cypher语句转换为一行,并在每个语句之间放置一个空格。这适用于neo4j浏览器控制台。

答案 5 :(得分:0)

我相信 apoc.cypher.runMany 会成功。

CALL apoc.cypher.runMany(statement, {})

(我正在通过 Python 驱动程序对此进行尝试。稍后我将根据我的发现更新这篇文章。)