2

我正在使用 Neo4j 和 gem 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 代码重写我上面的代码,将不胜感激。

4

3 回答 3

2

我不知道 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)
于 2014-05-23T18:36:57.343 回答
0
  1. 如果您不知道为什么要使用它,请不要再使用它
  2. 在neography中使用事务密码支持
  3. 在密码查询中使用参数,例如MATCH (u:User {name:{name}}) RETURN u
于 2014-05-25T01:23:58.917 回答
0

我也不知道 Neography,但你可以稍微简化一下查询,用这个衬里:

   MATCH (a:User),(b:User) WHERE a.userId ={id1} AND b.userId = {id2} CREATE UNIQUE (a)-[r:FOLLOWS]->(b) RETURN r
于 2014-05-26T02:14:07.263 回答