@Path(」/distance」)/*註解規定請求URL以/distance開始*/
Public class SocialNetworkExtension{
private final ExecutionEngine executionEngine ;
/*@ Context GraphDatabaseSerivce db引用到一個數據*/
Public SocialNetworkExtension(@ Context GraphDatabaseSerivce db){
This. executionEngine =new ExecutionEngine (db);
}
@GET/*get請求*/
@produces(「text/plain」)
@Path(「/{name1}/{name2}」) /*匹配/distance/name1/name2,佔位符*/
Public String getDistance(@PathParam(「name1」) String name1,@PathParam(「name2」) String name2){
String query=「start…」;
Map<String,Object> params=new HashMap<String,Object>();
params.put(「name1」,name1);
Params.put(「name2」,name2);
ExcutionResult result= executionEngine .execute(query,params);
Return String.valueof(result.columnAs(「depth」).next());
}}
數據結構:Neo4j將圖數據存儲在若干不一樣的存儲文件中,每一個存儲文件包含特定部分的數據(如節點,聯繫,屬性等),每一個節點記錄長度爲9個字節,經過大小固定的記錄能夠快速查找到存儲文件中的節點。一個節點的第一個字節是「是否在使用」的標誌位。接下來的4個字節表示關聯到該節點的第一個聯繫,最後4個字節表示該節點的第一個屬性的ID。節點是幾個指向聯繫和屬性列表的指針。
像節點同樣,聯繫存儲區的記錄的大小也是固定的,每一個記錄的長度爲33個字節。每一個聯繫記錄包含聯繫的起始節點ID和結束節點ID,聯繫類型的指針,以及起始節點和結束節點的上一個聯繫和下一個聯繫。
要讀取節點的屬性,只須要從指向第一個屬性的指針開始遍歷單向鏈表結構。要查詢一個節點的聯繫,能夠從指向第一個聯繫的節點聯繫指針開始,順着特定節點的聯繫的雙向鏈表尋找。
可使用聯繫關聯的起始節點ID和結束節點ID檢查他們的節點記錄,用這些ID乘以節點記錄的大小,就能夠當即計算出每一個節點在存儲文件中的偏移量
屬性記錄也是大小固定的,每一個屬性記錄包括4個屬性塊和屬性鏈中下一個屬性的ID(屬性的鏈表是單向的)
服務器集羣模式: Neo4j HA模式總有單個master,零個或多個slave。與其餘ms複製架構,Neo4j HA的slave能夠處理寫操做,而無需重定向寫入到master。
Neo4j HA使用Apache ZooKeeper來進行master選舉和服務器間狀態信息傳播。ZooKeeper能夠看作是分佈式服務協調器。Neo4j HA集羣須要依賴ZooKeeper進程初始主選擇,新master選舉和集羣內服務器狀態報告。當master故障,新的master將自動選舉。當 master故障,任何寫事務都將回滾,而且在master選舉期間,任何寫操做都不會發生。 ZooKeeper須要大量ZooKeeper實例從而保證正常運行。這就意味着zookeeper實例應該永遠是個奇數。
查詢語法(Cyphe Query Language)
neo4j本身基於圖論的搜索算法,實現了一套查詢語言解析,提供了一些常見的聚合函數(max,sum,min,count等)。
Ø START:在圖中的開始點,經過元素的ID或因此查找得到。
Ø MATCH:圖形的匹配模式,束縛於開始點。
Ø WHERE:過濾條件。
Ø RETURN:返回所須要的。
Ø CREATE:建立節點或者關係
Ø DELETE:刪除節點、關係或者屬性
Ø SET:設置屬性的值 FOREACH:對list中的元素一次一 個的執行操做( Performs updating actions once per element in a list)
Ø WITH:切分一個query成多個不一樣的部分
經過索引找到一個名叫'John'的用戶,並遍歷圖找到他的朋友的朋友,返回John和這些朋友的信息
START john=node:node_auto_index(name = 'John')
MATCH john-[:friend]->()-[:friend]->fof
RETURN john, fof
模糊查詢節點id屬性中包含11的,的節點。
START ne=node:ne('id=*11*')
return ne
條件,模糊查詢。查詢 label 含中山的網元
start n=node(3) match n-[:NE]-ne where ne.label =~ '.*中山.*'
return ne.id, ne.label, ne.name;
根據索引爲nePort,針對id模糊查詢所有節點。根據id排序,limit只取前10條記錄
start n = node:nePort('id:*')
match (x)-[:NE_PORT]->(n)
return n,x
order by n.id limit 10
Spring Data Neo4j:爲Spring開發人員提供了熟悉的方式與Neo4j進行交互,使用基於註解的方式與Spring的框架進行集成。在POJO(簡單java對象,Plain Old Java Object)實體及其域上添加一些註解,這樣Spring Data Neo4j就能將Java對象映射爲圖元素,這些實體的註解經過節點(@NodeEntity)和關係(@RelationshipEntity)來實現,域上註解聲明瞭與其它實體的關係(@RelatedTO),自定義轉換,自動標引(@Indexed)或者計算出的/衍生的值(@Query),Spring Data Neo4j容許咱們存儲實體的類型信息(繼承體系),從而能夠執行一些高級的操做和類型的轉換。
@NodeEntity
public class World {
private final static String REACHABLE_BY_ROCKET = "REACHABLE_BY_ROCKET";
@GraphId
private Long id;
// Uses default schema based index
@Indexed
private String name;
// Uses legacy index mechanism
@Indexed(indexType = IndexType.SIMPLE)
private int moons;
@Fetch
@RelatedTo(type = REACHABLE_BY_ROCKET, direction = Direction.BOTH)
private Set<World> reachableByRocket;
Spring Data Neo4j的核心是Neo4jTemplate,它提供了(相似與JdbcTemplate)各類低層級的功能,這些功能對Neo4j API進行了封裝以支持所匹配的領域對象。Spring Data Neo4j經過兩個XML命名空間元素來進行配置,用來進行通用開發的搭建和Repository的配置。
Spring Data Neo4j支持嵌入式模式和服務器模式,服務器模式要經過Neo4j的Java Rest API綁定來進行訪問
Org.springframe work.data:spring-data-neo4j
<dependencies>
<!-- SDN for simple mapping mode -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>${spring-data-neo4j.version}</version>
</dependency>
…
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-kernel</artifactId>
<version>${neo4j.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
•
嵌入式模式
•<?xml version="1.0" encoding="UTF-8" standalone="no"?>
•<beans xmlns="http://www.springframework.org/schema/beans"
• xmlns:context="http://www.springframework.org/schema/context"
• xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
• xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
• xmlns:tx="http://www.springframework.org/schema/tx"
•……">
•<context:spring-configured/>
• <context:annotation-config/>
• <context:component-scan base-package="org.springframework.data.neo4j.examples.hellograph" />
•<!—創建一個圖數據庫>
• <neo4j:config storeDirectory="target/neo4j-db-plain"
• base-package="org.springframework.data.neo4j.examples.hellograph.domain"/>
<neo4j:repositories base-package="org.springframework.data.neo4j.examples.hellograph.repositories"/>
•<tx:annotation-driven />
•</beans>
•
服務器模式
•<?xml version="1.0" encoding="UTF-8" standalone="no"?>
•<beans xmlns="http://www.springframework.org/schema/beans"
• xmlns:context="http://www.springframework.org/schema/context"
• xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
• xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
• xmlns:tx="http://www.springframework.org/schema/tx"
•……">
•<neo4j:config graphDatabaseService=「graphDatabaseService」/>
•<bean id=「graphDatabaseService」
•class=「org.springframework.data.neo4j.rest.SpringRestGraphDatabase」>
•<constructor index=「0」 value=「http://10.168.104.159:7474/db/data」>
•</bean>
•</beans>
Repository 數據訪問層,爲了讓代碼變得更加簡單,Spring Data在Template的基礎上提供了一個存儲( repository )抽象,這樣能夠減小數據訪問對象在實現一個普通接口時去定義通用場景的代價。
public class Customer{
private long id;
private String firstname;
private String lastname;
private Address address;
}
經過傳統的方式至少須要實現一個存儲類,包含基本的CRUD(create,read,Update和delete
)方法,以及經過限制條件來訪問實體子集的查詢方法。
使用Spring Data Repository 的方式可以避免大多數的代碼,只須要爲這個實體存儲聲明簡單的接口定義便可。
Public interface customerRepository extends Repository<Customer,long>{
……
}
激活Spring Data Repository
…
<beans:beans xmlns:……>
<jpa:repositories base-package=「com.XXX. repositoy」 >
</beans>
package org.springframework.data.neo4j.examples.hellograph.repositories;
import org.springframework.data.neo4j.examples.hellograph.domain.World;
import org.springframework.data.neo4j.repository.GraphRepository;
public interface WorldRepository extends GraphRepository<World> {}
1.聲明持久層的接口,該接口繼承 Repository,Repository 是一個標記型接口,它不包含任何方法,固然若是有須要,Spring Data 也提供了若干 Repository 子接口,其中定義了一些經常使用的增刪改查,以及分頁相關的方法。
2.在接口中聲明須要的業務方法。Spring Data 將根據給定的策略來爲其生成實現代碼。
3.在 Spring 配置文件中增長一行聲明,讓 Spring 爲聲明的接口建立代理對象。配置了 <jpa:repositories> 後,Spring 初始化容器時將會掃描 base-package 指定的包目錄及其子目錄,爲繼承 Repository 或其子接口的接口建立代理對象,並將代理對象註冊爲 Spring Bean,業務層即可以經過 Spring 自動封裝的特性來直接使用該對象。
此外,<jpa:repository> 還提供了一些屬性和子標籤,便於作更細粒度的控制。能夠在 <jpa:repository> 內部使用 <context:include-filter>、<context:exclude-filter> 來過濾掉一些不但願被掃描到的接口。
Spring Data JPA——參考文檔
http://jpa.coding.io/