Способы запоминания и повторного использования предыдущего результата запроса в Neo4j

Я пишу в Ruby, используя Neo4j с гемом Neography. При выполнении запроса я использую метод execute_neo4j_query, предоставленный Neography. Я не уверен в лучшей практике.

Предположим, я использую следующий код для получения пользователя:

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) Рекомендуется ли использовать методы, предоставляемые Neography, такие как @neo.create_node, кроме прямого использования execute_neo4j_query? Я выбрал последнее, потому что не уверен, что инкапсулированные методы могут удовлетворить мою задачу. Так что, если вы можете переписать мои вышеприведенные коды в родном коде Neography, это будет высоко оценено.

3 ответа

Решение
  1. Не используйте старт больше, если вы не знаете, зачем его использовать
  2. использовать поддержку транзакционного шифра в неографии
  3. Используйте параметры в ваших запросах шифра, как MATCH (u:User {name:{name}}) RETURN u

Я не знаю Neography, но я могу попытаться ответить на вопрос № 1, так как это может быть ответом при изменении вашего третьего запроса Cypher.

Поскольку ваши 2 начальных запроса, кажется, получают идентификаторы узлов для пользователя 1 и пользователя 2, вы должны быть в состоянии избежать повторного поиска этих узлов, используя START пункт. Вам нужно будет указать карту параметров с двумя идентификаторами узлов, возвращаемыми первыми двумя запросами.

  START user1=node(#{params[:node_id_1]}), user2=node(#{params[:node_id_2]})
  CREATE UNIQUE (user1)-[:FOLLOW]->(user2)

Я тоже не знаю Neography, но вы можете немного упростить запрос, используя один вкладыш:

   MATCH (a:User),(b:User) WHERE a.userId ={id1} AND b.userId = {id2} CREATE UNIQUE (a)-[r:FOLLOWS]->(b) RETURN r
Другие вопросы по тегам