Python Language
Py2Neo를 사용하는 Neo4j 및 Cypher
수색…
가져 오기 및 인증
from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()
Neo4j 데이터베이스가 localhost : 7474에 존재하는지 확인해야합니다.
graph
객체는 나머지 파이썬 코드의 neo4j 인스턴스에 대한 인터페이스입니다. 이 변수를 전역 변수로 만들어 주셔서 감사합니다. 클래스의 __init__
메소드에서이 변수를 유지해야합니다.
Neo4j 그래프에 노드 추가하기
results = News.objects.todays_news()
for r in results:
article = graph.merge_one("NewsArticle", "news_id", r)
article.properties["title"] = results[r]['news_title']
article.properties["timestamp"] = results[r]['news_timestamp']
article.push()
[...]
그래프에 노드를 추가하는 것은 매우 간단합니다. 중복되는 항목을 방지하기 때문에 graph.merge_one
이 중요합니다. (스크립트를 두 번 실행하면 두 번째로 제목을 업데이트하고 동일한 기사에 대한 새 노드를 만들지 않습니다)
neo4j에는 실제로 날짜 데이터 유형이 없으므로 timestamp
는 정수가 아니고 날짜 문자열이 아니어야합니다. 이로 인해 날짜를 '05 -06-1989 '로 저장하면 정렬 문제가 발생합니다.
article.push()
는 neo4j로 작업을 실제로 커밋하는 호출입니다. 이 단계를 잊지 마세요.
Neo4j 그래프에 관계 추가하기
results = News.objects.todays_news()
for r in results:
article = graph.merge_one("NewsArticle", "news_id", r)
if 'LOCATION' in results[r].keys():
for loc in results[r]['LOCATION']:
loc = graph.merge_one("Location", "name", loc)
try:
rel = graph.create_unique(Relationship(article, "about_place", loc))
except Exception, e:
print e
create_unique
는 중복을 피하기 위해 중요합니다. 하지만 그렇지 않으면 매우 간단합니다. 관계 이름은 고급 사례에서 사용하는 것처럼 중요합니다.
검색어 1 : 뉴스 제목에 대한 자동 완성
def get_autocomplete(text):
query = """
start n = node(*) where n.name =~ '(?i)%s.*' return n.name,labels(n) limit 10;
"""
query = query % (text)
obj = []
for res in graph.cypher.execute(query):
# print res[0],res[1]
obj.append({'name':res[0],'entity_type':res[1]})
return res
이것은 인수 text
시작하는 속성 name
을 가진 모든 노드를 가져 오는 샘플 cypher 쿼리입니다.
검색어 2 : 특정 날짜에 위치 별 뉴스 기사 가져 오기
def search_news_by_entity(location,timestamp):
query = """
MATCH (n)-[]->(l)
where l.name='%s' and n.timestamp='%s'
RETURN n.news_id limit 10
"""
query = query % (location,timestamp)
news_ids = []
for res in graph.cypher.execute(query):
news_ids.append(str(res[0]))
return news_ids
이 쿼리를 사용하여 관계로 위치 (l)
에 연결된 모든 뉴스 기사 (n)
를 찾을 수 있습니다.
Cypher 쿼리 샘플
시간이 지남에 따라 특정 사람과 관련된 기사 집계
MATCH (n)-[]->(l)
where l.name='Donald Trump'
RETURN n.date,count(*) order by n.date
적어도 5 개의 총 관계 노드가있는 Trump와 같은 뉴스 기사에 연결된 다른 사람 / 위치를 검색하십시오.
MATCH (n:NewsArticle)-[]->(l)
where l.name='Donald Trump'
MATCH (n:NewsArticle)-[]->(m)
with m,count(n) as num where num>5
return labels(m)[0],(m.name), num order by num desc limit 10