neo4j-圖數據庫


neo4j是圖數據庫

初識neo4j,首先我們要知道neo4j是圖數據庫。我們平常用的數據庫一般是RDBMS(關系型數據庫),那么什么是圖數據庫呢?既然有了關系型數據庫,那么為什么要有圖數據庫呢?

1.什么是圖數據庫
簡單來說:
圖形數據庫(圖形數據庫也稱為圖形數據庫管理系統或GDBMS。

圖數據庫的基本含義是以“圖”這種數據結構存儲和查詢數據,而不是存儲圖片的數據庫。它的數據模型主要是以節點和關系(邊)來體現,也可處理鍵值對。它的優點是快速解決復雜的關系問題。

數據結構:
在一個圖中主要包含兩種數據類型:Nodes(節點)和Relationships(關系)。他們各自內部又包含key-value形式的屬性,然后節點之間通過關系相連,形成了關系型的網狀結構

 

 


圖數據庫的應用
金融行業應用

反欺詐多維關聯分析場景
通過圖分析可以清楚地知道洗錢網絡及相關嫌疑,例如對用戶所使用的帳號、發生交易時的IP地址、MAC地址、手機IMEI號等進行關聯分析。

 

 

 

反欺詐多維關聯分析場景
反欺詐已經是金融行業一個核心應用,通過圖數據庫可以對不同的個體、團體做關聯分析,從人物在指定時間內的行為,例如去過地方的IP地址、曾經使用過的MAC地址(包括手機端、PC端、WIFI等)、社交網絡的關聯度分析,同一時間點是否曾經在同一地理位置附近出現過,銀行賬號之間是否有歷史交易信息等。

 

 


社交網絡圖譜
在社交網絡中,公司、員工、技能的信息,這些都是節點,它們之間的關系和朋友之間的關系都是邊,在這里面圖數據庫可以做一些非常復雜的公司之間關系的查詢。比如說公司到員工、員工到其他公司,從中找類似的公司、相似的公司,都可以在這個系統內完成。

 

 


企業關系圖譜
圖數據庫可以對各種企業進行信息圖譜的建立,包括最基本的工商信息,包括何時注冊、誰注冊、注冊資本、在何處辦公、經營范圍、高管架構。圍繞企業的經營范圍,繼續細化去查詢企業究竟有哪些產品或服務,例如通過企業名稱查詢到企業的自媒體,從而給予其更多關注和了解。另外也包括對企業的產品和服務的數據關聯,查看該企業有沒有令人信服的自主知識產權和相關資質來支撐業務的開展。

企業在日常經營中,與客戶、合作伙伴、渠道方、投資者都會打交道,這也決定了企業對社會各個領域都廣有涉獵,呈現面錯綜復雜,因此可以通過企業數據圖譜來查詢,層層挖掘信息。基於圖數據的企業信息查詢可以真正了解企業的方方面面,而不再是傳統單一的工商信息查詢。

 

 


2.什么是neo4j
Neo4j是一個高性能的NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。
它是一個嵌入式的、基於磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。
Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數據庫的所有特性。程序員工作在一個面向對象的、靈活的網絡結構下,而不是嚴格、靜態的表中。但是他們可以享受到具備完全的事務特性、企業級的數據庫的所有好處。
Neo4j因其嵌入式、高性能、輕量級等優勢,越來越受到關注。

Neo4j的特點
SQL就像簡單的查詢語言Neo4j CQL
它遵循屬性圖數據模型
它通過使用Apache Lucence支持索引
它支持UNIQUE約束
它包含一個用於執行CQL命令的UI:Neo4j數據瀏覽器
它支持完整的ACID(原子性,一致性,隔離性和持久性)規則
它采用原生圖形庫與本地GPE(圖形處理引擎)
它支持查詢的數據導出到JSON和XLS格式
它提供了REST API,可以被任何編程語言(如Java,Spring,Scala等)訪問
它提供了可以通過任何UI MVC框架(如Node JS)訪問的Java腳本
它支持兩種Java API:Cypher API和Native Java API來開發Java應用程序
Neo4j的優點
它很容易表示連接的數據
檢索/遍歷/導航更多的連接數據是非常容易和快速的
它非常容易地表示半結構化數據
Neo4j CQL查詢語言命令是人性化的可讀格式,非常容易學習
它使用簡單而強大的數據模型
它不需要復雜的連接來檢索連接的/相關的數據,因為它很容易檢索它的相鄰節點或關系細節沒有連接或索引
Neo4j的缺點或限制
Neo4j 2.1.3最新版本,它具有支持節點數,關系和屬性的限制。
它不支持Sharding。
下載地址
http://www.neo4j.org/download 根據操作系統和位數進行下載

基本使用
由於臨時需要neo4j數據庫,neo4j的安裝和環境配置,以及過多的cql的語法就不去給大家說明了,大家可以參考w3cschool的教程
https://www.w3cschool.cn/neo4j
大家可以在本地安裝一個neo4j,然后在自帶的瀏覽器中去執行一些簡單的操作命令

 

 


總結
這里我們初識了圖數據庫,知道了圖數據庫的關系模型,以及了解了neo4j的概念,優缺點,大家有時間可以多去練習neo4j的語法,把它練得和sql一樣熟練
下節我們針對通話記錄分析這一業務去進行neo4j的使用:
我們通過導入的方式將通話記錄的csv文件導入到neo4j中去,並且用springboot的后台去訪問這些節點和他們之間的關系,再通過d3去展示出來。
————————————————

上節我們了解了什么是圖數據庫,作為研究對象的neo4j的特點,優缺點以及基本的環境搭建。
現在我們要講存儲在csv中的通話記錄數據導入到neo4j中去,並且可以通過cql去查詢導入的數據及關系

1.選取導入方式
neo4j的導入方式有很多,我大概總結了一下:

Cypher CREATE 語句,為每一條數據寫一個CREATE
Cypher LOAD CSV 語句,將數據轉成CSV格式,通過LOAD CSV讀取數據。
官方提供的Java API —— Batch Inserter
大牛編寫的 Batch Import 工具
官方提供的 neo4j-import 工具
優缺點對比:

create語句 load csv語句 Batch Inseter Batch Import neo4j-import
適用場景 1~1w nodes 1w~10w nodes 千萬以上 nodes 千萬以上 nodes 千萬以上 nodes
速度 很慢(1000 nodes/s) 一般(5000 nodes/s) 非常快(數萬nodes/s) 非常快(數萬nodes/s) 非常快(數萬nodes/s)
優點 使用方便,可實時插入。 使用方便,可以加載本地 遠程CSV;可實時插入 基於Batch Inserter,可以直接運行編譯好的jar包;可以在已存在的數據庫中導入數據 官方出品,比Batch Import占用更少的資源
缺點 速度慢 需要將數據轉換成csv 需要轉成CSV;只能在JAVA中使用;且插入時必須停止neo4j 需要轉成CSV;必須停止neo4j 需要轉成CSV;必須停止neo4j;只能生成新的數據庫,而不能在已存在的數據庫中插入數據
可以看出導入的方式有很多,由於我們導入的數據量較大,所以我這里選擇的是最后一種 neo4j-import,大家也可以去選擇其他的導入方式

neo4j-import 使用
我們打開neo4j-import使用的網站可以看到這樣的一段摘要

Super Fast Batch Importer For Huge Datasets LOAD CSV is great for
importing small – medium sized data, i.e. up to the 10M records range.
For large data sets, i.e. in the 100B records range, we have access to
a specialized bulk importer.

We want to use it to import similar order data into Neo4j: customers,
orders and contained products.

The tool is located in path/to/neo4j/bin/neo4j-import and is used as
follows:

這段話的大致意思是我們使用load csv無法滿足我們大數據量的業務需要,所以我們不得不去選擇一種新的導入方式,這里我們選擇了neo4j-import這種方式,以下是一個導入的例子

bin/neo4j-import --into retail.db --id-type string \
--nodes:Customer customers.csv --nodes products.csv \
--nodes orders_header.csv,orders1.csv,orders2.csv \
--relationships:CONTAINS order_details.csv \
--relationships:ORDERED customer_orders_header.csv,orders1.csv,orders2.csv
1
2
3
4
5
例子中的數據結構為:
如果您調用neo4j-import沒有參數的腳本,它將列出一個全面的幫助頁面。

該--into retail.db顯然是目標數據庫,其中不能包含現有數據庫。

重復--nodes和--relationships參數是同一實體的多個(可能分裂的)csv文件的組,即具有相同的列結構。

每組的所有文件都被視為可以連接成一個大文件。一個標題行的組的第一個文件是必需的,它甚至可能被包含在其中可能比一個多GB的文本文件更易於處理和編輯一個單行文件。也支持壓縮文件。

customers.csv直接作為帶有:Customer標簽的節點導入,屬性直接從文件中獲取。
對於從:LABEL列中獲取節點標簽的產品也是如此。
訂單節點取自3個文件,一個標題和兩個內容文件。
輸入:CONTAINS的order_details.csv訂單項關系是通過其ID 來創建的,包含與所包含產品的訂單。
訂單通過再次使用訂單csv文件連接到客戶,但這次使用不同的標頭,其中:IGNORE是不相關的列
這–id-type string表示所有:ID列都包含字母數字值(對僅數字ID進行優化)。
列名用於節點和關系的屬性名稱,特定列有一些額外的標記

name:ID - 全局id列,通過該列查找節點以便以后重新連接,
如果保留屬性名稱,它將不會被存儲(臨時),這就是–id-type所指的
如果你有跨實體的重復id,你必須在括號中提供實體(id-group) :ID(Order)
如果您的ID是全球唯一的,您可以將其關閉
:LABEL - 節點的標簽列,多個標簽可以用分隔符分隔
:START_ID,:END_ID- 關系文件列,引用節點ID,用於id-groups使用:END_ID(Order)
:TYPE - 關系型列
所有其他列都被視為屬性,但如果為空或在注釋時跳過:IGNORE
類型轉換可以通過后面添加的名稱,例如通過:INT,:BOOLEAN等
導入通話記錄數據
在整理后的csv中我們的通話記錄是這樣的數據:

phones.csv 記錄電話號列表,作為nodes結點


phone_header 標題文件只有一行數據
phone:ID

call.csv 該文件記錄通話記錄的信息,作為以后關系的建立和關系屬性的添加

第一行從左到右字段的含義為:
150 **** 0743給136 **** 5301一共打了125分鍾時長的電話,打了一次,平均一次125分鍾

call_header.csv 通話記錄頭信息

這里的:START_ID指的是關系的起始點,:END_ID指的是關系的終止點

這些csv文件准備好之后,我們寫一段shell腳本來執行這些文件。

import()
{
#導入命令
neo4j stop
cd /usr/local/Cellar/neo4j/3.5.0/libexec/data/databases
rm -rf graph.db
cd /Documents/歸檔/data
neo4j-admin import \
--database=graph.db
--nodes:phone="../phone_header.csv,phones.csv \
--ignore-duplicate-nodes=true \
--ignore-missing-nodes=true \
--relationships:call="../call_header.csv,call.csv"
neo4j start
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
這里以防我們新建的數據庫已經存在,我們選擇刪除已有庫再進行導入
記得要先關閉neo4j
查看結果
導入完成之后我們來打開neo4j瀏覽器查看一下導入后的結果
我們打開http://localhost:7474/browser/
首先我們先查看一下Database Information

這里我們可以看到已有的結點數,有多少條關系,占用的存儲空間等數據庫信息
然后我們來查看某個電話號碼的交際圈:

match (p:phone{phone:"13825259929"})-[r]->(o) return p,o,r;
1

把鼠標移到對應的結點和關系上時,底部便會出現對應的屬性
現在我們的數據導入就完成了
接下來我們要用springboot + neo4j +d3來展示某人的通話記錄圈。
————————————————
版權聲明:本文為CSDN博主「抓住流浪劍客的小Yi巴」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_32519415/article/details/87942379


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM