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:角色)
表します。コマンドの実行後には使用できません。同時に、シングルは匿名ノードを意味し、マッチングする場合はすべてのノードと一致することを意味します。角色
n
n
()
付き合ってる
--
方向性のない関係を表す-->
方向性の関係を示します-[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
merge
のcreate
違い
MERGE = MATCH + CREATE
したがって、グラフデータを追加する際、既存のノードやリレーションをスキップしたい場合はコマンドを使用し、MERGE
ノードやリレーションの重複を気にしない場合はCREATE
コマンドを使用すると考えられます。
一致ステートメント
// 匹配 name 为 郭靖 的 角色 节点
match (n:角色{name:'郭靖'}) return n
消去
DELETE
Neo4j では、と の2 つの削除方法がありますREMOVE
。DELETE
ノードとリレーションシップを削除するために使用され、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]