Neo4j グラフデータベースの基本操作

Neo4j


コマンドラインウィンドウ neo4j.bat コンソール

rdf形式でファイルをインポートする

:GET /rdf/ping
CALL n10s.graphconfig.init(); //初始化
call n10s.rdf.import.fetch("file:///F:\\wow.rdf",'Turtle')// 导入注意斜杠///(本地文件需要用这个)

すべてのデータをクリア

ここで注意すべき点は、孤立したリレーションシップがないため、リレーションシップのあるノードを削除したい場合は、そのノードのリレーションシップをすべて同時に削除する必要があることです。

つまり、パス内のノード a と b を削除したい場合は(a)-[d]-(b)-[e]-(c)、リレーション d と e を同時に削除する必要があります。

したがって、データベースをクリアする、つまりすべてのノードと関係を削除する場合は、まず を使用してすべてのノードをMATCH検索し、次に を使用してOPTIONAL MATCHノードに関係があるかどうかをクエリし、最後にすべてを削除します。

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r

戻る

CREATEコマンドは同時に実行しなくても使用できるためRETURN、使用するとインターフェースRETURNに戻ります。Graph

CQL

Neo4j の Cypher 言語はグラフ データを処理するために構築されており、CQL は Cypher Query Language の略です。Oracle データベースにクエリ言語 SQL があるのと同様に、Neo4j にはクエリ言語として CQL があります。

ノードと関係

()Cypher では、ノードを表すために括弧のペアを使用します。たとえばコマンドの実行時にこのノードにアクセスするために使用される変数名であるノードを(n:角色)表します。コマンドの実行後には使用できません。同時に、シングルは匿名ノードを意味し、マッチングする場合はすべてのノードと一致することを意味します。角色nn()

付き合ってる

  • --方向性のない関係を表す
  • -->方向性の関係を示します
  • -[r]->次に、リレーションシップの操作を容易にするためにリレーションシップに変数名を割り当てます。
  • -[r:配偶]->マッチング関係の配偶タイプは次のとおりです
追加、削除、変更、確認
//建立结点
create(n:Person{name:"小江",sex:"男"}) return n                 
//建立关系 (小江是小王的爸爸)
MATCH(a:Person{name:"小江"}),(b:Person{name:"小王"})Merge(a)-[r:爸爸]->(b)
//创建节点的时候就建立好关系                                                                  
CREATE (a:Person {name:'苗同学'})-[r:朋友]->(b:Person {name:'叶同学'})
//修改  把name是小王的name改成小江
Match (a:Person{name:"小王"})set a.name="小江"
//搜索 信息是大学生的,返回改结点
match(a:Person{info:"大学生"}) return a
//在一个结点中建立新的属性,在名字为小陈这个结点添加info属性
match (a:Person{name:"小陈"}) set a.info="小学生"
//删除结点的某个属性
match (a:Person{name:"小陈"}) remove a.info
//删除关系
match(a:Person{name:"小陈"})-[r:`爸爸`]-(b:Person{name:"江"}) delete r
//删除结点  To delete this node, you must first delete its relationships.删除结点前要先删除关系
match (a:Person{name:"小江"}) delete a                                                  

mergecreate違い

MERGE = MATCH + CREATEしたがって、グラフデータを追加する際、既存のノードやリレーションをスキップしたい場合はコマンドを使用し、MERGEノードやリレーションの重複を気にしない場合はCREATEコマンドを使用すると考えられます。

一致ステートメント
  1. ラベルに基づいてノードを照合する

    //匹配所有角色节点
    match (n:角色) return n
    
  2. ラベルと属性に基づいてノードを照合する

// 匹配 name 为 郭靖 的 角色 节点
match (n:角色{name:'郭靖'}) return n
消去

DELETENeo4j では、と の2 つの削除方法がありますREMOVEDELETEノードとリレーションシップを削除するために使用され、REMOVEノードとリレーションシップのラベルと属性を削除するために使用されます。両方が連携する必要がありMATCH、まず内容を一致させてから操作を実行します。

ノードの削除

ノードを削除するには、そのノードに関連するすべてのエッジを削除する必要があります。これはグラフ理論と一致しており、ノードのないエッジは存在しません。したがって、Jinlun Fawang のノードを削除するには、まずノードとその関係を見つけてから削除する必要があります。

match(n:`角色`{name:"王重阳"})-[r]-() delete n,r
データのインポート

ここに画像の説明を挿入します

load csv with headers from 'file:///data\\射雕三部曲.csv' as line
match (book:作品),(person:角色),(skill:武功)
    where
        book.name in split(line.作品, ',') and
        person.name = line.人物 and
        skill.name in split(line.武功, ',')
optional match (father:角色)
    where
        father.name = line.父
optional match (mother:角色)
    where
        mother.name = line.母
optional match (spouse:角色)
    where
        spouse.name = line.配偶
optional match (sect:门派)
    where
        sect.name = line.门派
optional match (children:角色)
    where
        children.name in split(line.子女, ',')
optional match (master:角色)
    where
        master.name in split(line.师傅, ',')
merge (person)-[:所在作品]-(book)
merge (person)-[:师傅]-(master)
merge (person)-[:武功]-(skill)
merge (person)-[:父]-(father)
merge (person)-[:母]-(mother)
merge (person)-[:配偶]->(spouse)
merge (person)-[:所在门派]-(sect)
merge (person)-[:子女]-(children)
現在の問題

1. 高血圧にとって最も重要な栄養素はカリウムとナトリウムですが、以前のデータにはカリウムは含まれていませんでした。

2 つのデータ、別々にマップを構築することは可能ですが、結合することはできません

私のアイデアは、まず原材料と栄養のマップを作成し、次に料理と原材料のマップを構築し、原材料が入手可能であれば、それを接続することです。

カテゴリを作成して、豊富であればカリウム要素に、少量であればナトリウム要素に、その他であれば内容を記載します。関係。

メニュー
load csv with headers from 'file:///data\\export.csv' as line
merge(n:食物{name:line.食物名,kind:line.分类}) return n
create(n:营养素{name:"钠"}) return n  //建立营养素
解決された問題

1. グラフ データベースに接続するための新しいバージョンの Python を作成する方法

インターネット上ではこのようなことがよくありますが、間違いを報告します

graph = Graph("http://localhost:7474", username="root", password='123456')

理由はPythonのバージョンの問題で、正しい書き方は以下の通りです

graph = Graph('http://localhost:7474', auth=("neo4j", "123456"))

2.报错:UnicodeDecodeError: 'gbk' コーデックは位置のバイト 0xaa をデコードできません

エンコード方法の問題です

with open("D:\\neo4j-community-4.4.14-windows\\neo4j-community-4.4.14\\import\\data\\export.csv", 'r',encoding='utf-8') as f:

最後に、encoding='utf-8' を追加するだけです。

match (a:nutrients)-[:富含]-(b:recipe_matrial{name:"生菜"})-[:include]-(c:recipe) return a,b,c
match (a:recipe{name:"蚂蚁上树"})-[:include]-(b:recipe_matrial)-[:have]-(c) return a,b,c
match(a:食材{name:{foodName}})-[:推荐食用]-(b:疾病) return a,b

ボボジのすべての関係を検索しますが、1 つのレベルのみを検索します

match (n:recipe{name:"蚂蚁上树"})--(b) return n,b

二層関係

match (n:recipe{name:"蚂蚁上树"})--(b)-->(c) return n,b,c
match n=(x:recipe)-[*1..2]-() where x.name="钵钵鸡" return n

野菜から直接栄養素を摂取すれば塩分は含まれません

料理から食材を探し、次に栄養素を探す場合、2 つのデータは分離され、一部の食材はもう一方のデータでは取得できません。

        if question_type == 'disease_cause':
            sql = ["MATCH (m:Disease) where m.name = '{0}' return m.name, m.cause".format(i) for i in entities]

おすすめ

転載: blog.csdn.net/Aure219/article/details/131956722