我在Ruby中使用Neo4j与gem Neography编码。在执行查询时,我使用neoography提供的execute_neo4j_query方法。我不确定最好的做法是什么。
假设我使用以下代码来获取一个用户:
user1 = @neo.execute_neo4j_query("
MATCH (user:User {user_id: '#{params[:user_id_1]}'})
RETURN id(user)
LIMIT 1
")
和获取另一个用户类似的
user2 = @neo.execute_neo4j_query("
MATCH (user:User {user_id: '#{params[:user_id_2]}'})
RETURN id(user)
LIMIT 1
")
然后我对这两个用户做了一些事情。
现在我需要在这两个用户之间创建一条边,所以我输入
@neo.execute_neo4j_query("
MATCH (user1:User {user_id: '#{params[:user_id_2]}'})
MATCH (user2:User {user_id: '#{params[:user_id_2]}'})
CREATE UNIQUE (user1)-[:FOLLOW]->(user2)
")
但是,我认为这种方法不是最优的,因为我查询了相同的两个用户两次。
我的问题是:1)是否有一种方法可以使用neoography重用以前查询的结果?
2)是否建议使用Neography提供的方法,如@neo。Create_node而不是直接使用execute_neo4j_query ?我选择后者是因为我不确定封装的方法是否能满足我的任务。所以,如果你能把我上面的代码重写成原生的Neography代码,我将不胜感激。
我不知道Neography,但我可以尝试回答问题#1,因为这似乎可以通过更改您的第三个Cypher查询来回答。
因为你的2个初始查询似乎得到了用户1和用户2的节点id,你应该能够避免通过使用START
子句再次搜索这些节点。您需要使用前两个查询返回的2个节点id指定一个参数映射。
START user1=node(#{params[:node_id_1]}), user2=node(#{params[:node_id_2]})
CREATE UNIQUE (user1)-[:FOLLOW]->(user2)
- 如果你不知道为什么要用start,就不要再用了
- 在neography中使用事务性密码支持
- 在密码查询中使用参数,如
MATCH (u:User {name:{name}}) RETURN u
我也不懂Neography,但是您可以稍微简化一下查询,使用这一行:
MATCH (a:User),(b:User) WHERE a.userId ={id1} AND b.userId = {id2} CREATE UNIQUE (a)-[r:FOLLOWS]->(b) RETURN r