Otimizar este Neo4J Cypher consulta
Pergunta
Eu estou aprendendo Neo4J e o meu brinquedo projeto é jogar com o Twitter.Neste pequeno script que estou usando python tweepy e py2neo para tomar um twitter_user e inserir todos os seus amigos.
def insert_friends(twitter_user):
for friend in Cursor(api.friends, user_id=twitter_user.id_str).items():
n=neo4j.CypherQuery(graph_db,"""
MATCH (user),(friend)
WHERE user.id_str={user_id_str} AND friend.id_str={friend_id_str}
CREATE UNIQUE (user)-[:FOLLOWS]->(friend)
""").execute_one(user_id_str=twitter_user.id_str, friend_id_str=friend.id_str)
Isso funciona bem, mas eu suspeito que ele pode ser otimizado.Ou seja, a cláusula WHERE, eu estou olhando para o mesmo usuário.id de cada vez.Como posso evitar que o extra de pesquisa de cada vez?Por exemplo, existe uma maneira que eu poderia, a priori, descobrir qual o nó está em Neo4J e apenas especificar o Neo4J interna id de nó?
Solução
Você precisa usar rótulos e índices!
A saber:
CREATE INDEX on :User(id_str);
MATCH (user:User),(friend:User) // add labels so it knows to use the index
WHERE user.id_str={user_id_str} AND friend.id_str={friend_id_str}
CREATE UNIQUE (user)-[:FOLLOWS]->(friend);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow