サーチ…


インポートと認証

from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()

Neo4jデータベースがlocalhost:7474に存在し、適切な資格情報を持っていることを確認する必要があります。

graphオブジェクトはあなたのPythonコードの残りの部分の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は、重複するアイテムを防ぐので重要です。 (スクリプトを2回実行すると、2回目にタイトルが更新され、同じ記事の新しいノードは作成されません)

timestampは整数でなくてはならず、日付文字列ではありません。なぜなら、neo4jは実際に日付データ型を持っていないからです。これは、日付を'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を持つすべてのノードを取得するサンプルのサイファークエリtext

クエリ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つのトータルリレーションシップノードを持つトランプと同じニュース記事に接続されている他の人物/場所を検索します。

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow