我使用Neo4j和Ruby Neography在Ruby编码。在进行查询时,我使用Neography提供的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)有没有办法使用Neography重用以前查询过的结果?
2)除了直接使用execute_neo4j_query之外,是否建议使用Neography提供的方法,如@ neo.create_node?我选择后者是因为我不确定封装的方法是否能满足我的任务。因此,如果您可以在本机Neography代码中重写上述代码,我们将非常感激。
答案 0 :(得分:1)
我不知道Neography,但我可以尝试回答问题#1,因为这似乎可以通过改变你的第三个Cypher查询来回答。
由于您的2个初始查询似乎正在获取用户1和用户2的节点ID,因此您应该能够避免使用START
子句再次搜索这些节点。您需要使用前2个查询返回的2个节点ID指定参数映射。
START user1=node(#{params[:node_id_1]}), user2=node(#{params[:node_id_2]})
CREATE UNIQUE (user1)-[:FOLLOW]->(user2)
答案 1 :(得分:0)
MATCH (u:User {name:{name}}) RETURN u
答案 2 :(得分:0)
我也不知道Neography,但你可以稍微简化一下这个问题:
MATCH (a:User),(b:User) WHERE a.userId ={id1} AND b.userId = {id2} CREATE UNIQUE (a)-[r:FOLLOWS]->(b) RETURN r