Cypherとは

  • グラフ構造のデータを処理するために開発されたクエリ言語
  • Neo4jでデータをクエリするために必要
  • こんな感じで記述できるらしい
"CREATE (:Person { name: ’Dan’ })-[:MARRIED { day:’1970-02-14 } ]->(:Person { name : ’ Ann’)"
  • コマンド ノード -エッジ-> ノードみたいな書き方になる。

    • CREATE(コマンド) (:Person { name: ’Dan’ })(ノード) -[:MARRIED { day:’1970-02-14 } ]->(エッジ) (:Person { name: ’Dan’ })(ノード)
  • 参照

Cypherの書き方

Neo4j Python Driver

  • 関係性を記載しない場合、ノードのみをデータベースに加えることも可能
from neo4j import GraphDatabase, RoutingControl
 
URI = "neo4j://neo4j:7687"
AUTH = ("neo4j", "password")
 
with GraphDatabase.driver(URI, auth=AUTH) as driver:
	driver.execute_query(
	            """
	            MERGE (:Person {name:$name})
	            """,
	            name="Android",database_="neo4j"
	        )
  • MATCHした後にRETURNして、返ってきたRecordクラスのプロパティにアクセスするには、下記のようにする。
    records, _, _ = driver.execute_query(
        "MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
        "RETURN friend ORDER BY friend.name",
        name=name, database_="neo4j", routing_=RoutingControl.READ,
    )
    for record in records:
        print(record['friend']['age']) # friendはname,ageのプロパティを持っていて、ageの値をプリント
 
  • ノードだけでなく、エッジにもプロパティは与えられる。
    driver.execute_query(
        "MERGE (bro:Person {name: $name}) "
        "MERGE (friend:Person {name: $friend_name,age:$age}) "
        "MERGE (bro)-[:KNOWS {percent: $percent}]->(friend)", #エッジにpercentというプロパティを与える。
        name=name, friend_name=friend_name,age=age,percent=1,database_="neo4j",
    )
 

Cypherクエリ

  • ノードを全削除するクエリ
MATCH (n)
DETACH DELETE n