Способы запоминания и повторного использования предыдущего результата запроса в 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 ответа
- Не используйте старт больше, если вы не знаете, зачем его использовать
- использовать поддержку транзакционного шифра в неографии
- Используйте параметры в ваших запросах шифра, как
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