知識圖譜和neo4j的基本操作
一.知識圖譜的簡介
1.知識圖譜是什麼
知識圖譜本質上是語義網絡(Semantic Network)的知識庫
可以理解為一個關係圖網絡。
2.什麼是圖
圖(Graph)是由節點(Vertex)和邊(Edge)來構成,多關係圖一般包含多種類型的節點和多種類型的邊。
3.什麼是Schema
限定待加入知識圖譜數據的格式;相當於某個領域內的數據模型,包含了該領域內有意義的概念類型以及這些類型的屬性
二.知識圖譜的構建
1.數據來源
結構化數據和非結構化數據,前者可能是本地數據庫中的信息,後者主要是在網頁上抓取的信息。
2.涉及的技術
命名實體識別,關係抽取等自然語言處理技術。
三.知識圖譜的存儲
- 一種是基於RDF的存儲;
- 另一種是基於圖數據庫的存儲。
RDF一個重要的設計原則是數據的易發佈以及共享,圖數據庫則把重點放在了高效的圖查詢和搜索上。其次,RDF以三元組的方式來存儲數據而且不包含屬性信息,但圖數據庫一般以屬性圖為基本的表示形式,所以實體和關係可以包含屬性,這就意味着更容易表達現實的業務場景。其中Neo4j系統目前仍是使用率最高的圖數據庫,它擁有活躍的社區,而且系統本身的查詢效率高,但唯一的不足就是不支持准分佈式。
四.Neo4j的介紹
Neo4j為常用的圖數據庫之一。
Neo4j的安裝很簡單,先到官方網站Neo4j下載,下載完壓縮包之後直接解壓縮,然後配置好環境變量,可以按照這篇博客的方法//www.cnblogs.com/jpfss/p/10874303.html。
之後我們在瀏覽器內輸入//127.0.0.1:7474/browser/就進入了Neo4j的界面。
五.Neo4j的基本操作
//刪庫 MATCH (n) DETACH DELETE n //創建人物結點 CREATE (n:Person {name:'John'}) RETURN n //創建地區結點 CREATE (n:Location {city:'Miami', state:'FL'}) //創建朋友關係 MATCH (a:Person {name:'Liz'}), (b:Person {name:'Mike'}) MERGE (a)-[:FRIENDS]->(b) //創建出生地關係 MATCH (a:Person {name:'John'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1978}]->(b); MATCH (a:Person {name:'Liz'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1981}]->(b); //按照出生地查詢 MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b //查詢所有對外有關係的結點和類型 MATCH (a)-[r]->() RETURN a.name, type(r) //查詢所有婚姻關係的結點 MATCH (n)-[:MARRIED]-() RETURN n //查找某人朋友的朋友 MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName //增加或者修改結點屬性 MATCH (a:Person {name:'Liz'}) SET a.age=34 //刪除結點屬性 MATCH (a:Person {name:'Mike'}) SET a.test='test'; MATCH (a:Person {name:'Mike'}) REMOVE a.test;
六.在python中操縱neo4j
1.neo4j模塊
# step 1:導入 Neo4j 驅動包 from neo4j import GraphDatabase # step 2:連接 Neo4j 圖數據庫 driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password")) # 添加 關係 函數 def add_friend(tx, name, friend_name): tx.run("MERGE (a:Person {name: $name}) " "MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})", name=name, friend_name=friend_name) # 定義 關係函數 def print_friends(tx, name): for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name " "RETURN friend.name ORDER BY friend.name", name=name): print(record["friend.name"]) # step 3:運行 with driver.session() as session: session.write_transaction(add_friend, "Arthur", "Guinevere") session.write_transaction(add_friend, "Arthur", "Lancelot") session.write_transaction(add_friend, "Arthur", "Merlin") session.read_transaction(print_friends, "Arthur")
注意這裡的密碼要改成自己的,否則無法正常登陸。運行完上面的腳本後,就出現了如下的結點和邊:
2.py2neo模塊
# step 1:導包 from py2neo import Graph, Node, Relationship # step 2:構建圖 g = Graph("//localhost:7474",auth=("neo4j","password")) # step 3:創建節點 tx = g.begin() a = Node("Person", name="Alice") tx.create(a) b = Node("Person", name="Bob") # step 4:創建邊 ab = Relationship(a, "KNOWS", b) # step 5:運行 tx.create(ab) tx.commit()