天天看點

Neo4j-Apoc

Neo4j-Apoc

<!-- 作者區域 -->
    


    <!-- 文章内容 -->
    <div data-note-content="" class="show-content">
      <div class="show-content-free">
        <p>APOC</p>
           

https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_virtual_nodes_rels

提供的函數 存儲過程應有盡有, 也可以自行實作添加

CALL apoc.help("dijkstra")

Apoc配置:

apoc.trigger.enabled=false/true  :  Enable triggers

apoc.ttl.enabled=false/true:  Enable time to live background task


apoc.jdbc.<key>.uri=jdbc-url-with-credentials :  配置資料庫連接配接串


apoc.es.<key>.uri=es-url-with-credentials:  ES連接配接


apoc.mongodb.<key>.uri=mongodb-url-with-credentials: mongodb連接配接


apoc.couchbase.<key>.uri=couchbase-url-with-credentials: couchbase連接配接


apoc.jobs.scheduled.num_threads=number-of-threads: APOC排程器的線程池

              apoc.jobs.pool.num_threads=number-of-threads: 執行器的線程池

           

有用的函數方法:

解析域名: WITH 'http://www.example.com/all-the-things' AS url RETURN apoc.data.domain(url) // will return 'www.example.com'

日期函數:

       
apoc.date.parse(<span class="hljs-string"><span class="hljs-string">'2015/03/25 03-15-59'</span></span>,[<span class="hljs-string"><span class="hljs-string">'s'</span></span>],[<span class="hljs-string"><span class="hljs-string">'yyyy/MM/dd HH/mm/ss'</span></span>])

apoc.date.add(<span class="hljs-number"><span class="hljs-number">12345</span></span>, <span class="hljs-string"><span class="hljs-string">'ms'</span></span>, <span class="hljs-number"><span class="hljs-number">-365</span></span>, <span class="hljs-string"><span class="hljs-string">'d'</span></span>) 
           
格式轉換:
<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> apoc.number.format(<span class="hljs-number"><span class="hljs-number">12345.67</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">as</span></span> value

<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> apoc.number.format(<span class="hljs-number"><span class="hljs-number">12345</span></span>, <span class="hljs-string"><span class="hljs-string">'#,##0.00;(#,##0.00)'</span></span>, <span class="hljs-string"><span class="hljs-string">'it'</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">as</span></span> value
           
數學運算:
<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> apoc.number.exact.add(stringA,stringB)

<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> apoc.number.exact.sub(stringA,stringB)

ETURN apoc.number.exact.mul(stringA,stringB,[prec],[roundingModel]

<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> apoc.number.exact.div(stringA,stringB,[prec],[roundingModel])

<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> apoc.number.exact.toInteger(string,[prec],[roundingMode])

<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> apoc.number.exact.toFloat(string,[prec],[roundingMode])

<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> apoc.number.exact.toExact(number)
           
比較節點不同:
apoc.diff.nodes([leftNode],[rightNode])
           

圖算法:

路徑擴充(選擇走哪些邊, 哪些節點, 幾層, 什麼時候結束等等):
       
CALL apoc.path.expand(startNode &lt;id&gt;|Node, relationshipFilter, labelFilter, minLevel, maxLevel )

MATCH (user:User) WHERE user.id = <span class="hljs-number"><span class="hljs-number">460</span></span>
CALL apoc.path.expandConfig(user,{relationshipFilter:<span class="hljs-string"><span class="hljs-string">"RATED"</span></span>,minLevel:<span class="hljs-number"><span class="hljs-number">3</span></span>,maxLevel:<span class="hljs-number"><span class="hljs-number">3</span></span>,bfs:<span class="hljs-keyword"><span class="hljs-keyword">false</span></span>,uniqueness:<span class="hljs-string"><span class="hljs-string">"NONE"</span></span>}) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> path
<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> count(*);


apoc.path.subgraphAll(startNode &lt;id&gt;Node/<span class="hljs-keyword"><span class="hljs-keyword">list</span></span>, {maxLevel, relationshipFilter, labelFilter, bfs:<span class="hljs-keyword"><span class="hljs-keyword">true</span></span>, filterStartNode:<span class="hljs-keyword"><span class="hljs-keyword">true</span></span>, limit:<span class="hljs-number"><span class="hljs-number">-1</span></span>}) <span class="hljs-keyword"><span class="hljs-keyword">yield</span></span> nodes, relationships


MATCH (user:User) WHERE user.id = <span class="hljs-number"><span class="hljs-number">460</span></span>
CALL apoc.path.subgraphNodes(user, {}) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> node
<span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> node;
           
Closeness Centrality:
CALL apoc.algo.closeness([<span class="hljs-string"><span class="hljs-string">'TYPE'</span></span>],nodes,<span class="hljs-string"><span class="hljs-string">'INCOMING'</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> node, score
           
Betweenness Centrality:
CALL apoc.algo.betweenness([<span class="hljs-string"><span class="hljs-string">'TYPE'</span></span>],nodes,<span class="hljs-string"><span class="hljs-string">'BOTH'</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> node, score
           
pageRank:
CALL apoc.algo.pageRank(nodes) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> node, score

<span class="hljs-comment"><span class="hljs-comment">// only compute over relationships of types TYPE_1 or TYPE_2</span></span>

CALL apoc.algo.pageRankWithConfig(nodes,{types:<span class="hljs-string"><span class="hljs-string">'TYPE_1|TYPE_2'</span></span>}) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> node, score

<span class="hljs-comment"><span class="hljs-comment">// peroform 10 page rank iterations, computing only over relationships of type TYPE_1</span></span>

CALL apoc.algo.pageRankWithConfig(nodes,{iterations:<span class="hljs-number"><span class="hljs-number">10</span></span>,types:<span class="hljs-string"><span class="hljs-string">'TYPE_1'</span></span>}) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> node, score
           
dijkstra:
apoc.algo.dijkstra(startNode, endNode, <span class="hljs-string"><span class="hljs-string">'KNOWS|&lt;WORKS_WITH|IS_MANAGER_OF&gt;'</span></span>, <span class="hljs-string"><span class="hljs-string">'distance'</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> path, weight

apoc.algo.dijkstraWithDefaultWeight(startNode, endNode, <span class="hljs-string"><span class="hljs-string">'KNOWS|&lt;WORKS_WITH|IS_MANAGER_OF&gt;'</span></span>, <span class="hljs-string"><span class="hljs-string">'distance'</span></span>, <span class="hljs-number"><span class="hljs-number">10</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> path, weight

example:

    MATCH (from:Loc{name:<span class="hljs-string"><span class="hljs-string">'A'</span></span>}), (to:Loc{name:<span class="hljs-string"><span class="hljs-string">'D'</span></span>})
    CALL apoc.algo.dijkstra(from, to, <span class="hljs-string"><span class="hljs-string">'ROAD'</span></span>, <span class="hljs-string"><span class="hljs-string">'d'</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">yield</span></span> path <span class="hljs-keyword"><span class="hljs-keyword">as</span></span> path, weight <span class="hljs-keyword"><span class="hljs-keyword">as</span></span> weight
    <span class="hljs-keyword"><span class="hljs-keyword">RETURN</span></span> path, weight
           
community: 标簽傳播的社群發現算法
apoc.algo.community(times,labels,partitionKey,type,direction,weightKey,batchSize)

example:  周遊<span class="hljs-number"><span class="hljs-number">25</span></span>輪, 

    CALL apoc.algo.community(<span class="hljs-number"><span class="hljs-number">25</span></span>,<span class="hljs-keyword"><span class="hljs-keyword">null</span></span>,<span class="hljs-string"><span class="hljs-string">'partition'</span></span>,<span class="hljs-string"><span class="hljs-string">'X'</span></span>,<span class="hljs-string"><span class="hljs-string">'OUTGOING'</span></span>,<span class="hljs-string"><span class="hljs-string">'weight'</span></span>,<span class="hljs-number"><span class="hljs-number">10000</span></span>)
           
aStar: A*周遊算法
apoc.algo.aStar(startNode, endNode, <span class="hljs-string"><span class="hljs-string">'KNOWS|&lt;WORKS_WITH|IS_MANAGER_OF&gt;'</span></span>, <span class="hljs-string"><span class="hljs-string">'distance'</span></span>,<span class="hljs-string"><span class="hljs-string">'lat'</span></span>,<span class="hljs-string"><span class="hljs-string">'lon'</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> path, weight
           
cliques: 聚類社群算法:
apoc.algo.cliques(minSize) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> clique

apoc.algo.cliquesWithNode(startNode, minSize) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> clique
           
各種距離算法:
apoc.algo.cosineSimilarity([vector1], [vector2])   cosin相似度

apoc.algo.euclideanDistance([vector1], [vector2])  歐幾裡得距離

apoc.algo.euclideanSimilarity([vector1], [vector2])  歐幾裡得相似度
           

Virtual Nodes/Rels: 虛拟節點, 關系 類似視圖的概念

MATCH (a)-[r]->(b)
WITH head(labels(a)) AS l, head(labels(b)) AS l2, type(r) AS rel_type, count(*) as count
CALL apoc.create.vNode([l],{name:l}) yield node as a
CALL apoc.create.vNode([l2],{name:l2}) yield node as b
CALL apoc.create.vRelationship(a,rel_type,{count:count},b) yield rel
RETURN *;

CALL apoc.create.vPattern({_labels:['Person'],name:'Mary'},'KNOWS',{since:2012},{_labels:['Person'],name:'Michael'})


CALL apoc.create.vPattern({_labels:['Person', 'Woman'],name:'Mary'},'KNOWS',{since:2012},{_labels:['Person', 'Man'],name:'Michael'})

              CALL apoc.create.vPatternFull(['British','Person'],{name:'James', age:28},'KNOWS',{since:2009},['Swedish','Person'],{name:'Daniel', age:30})

           

Cypher Exectuion: 批量執行腳本

CALL apoc.cypher.runFiles([files or urls],{config}) yield row, result   

runs each statement in the files, all semicolon separated

              CALL apoc.cypher.runFile(file or url,{config}) yield row, result

runs each statement in the file, all semicolon separated - currently no schema operations

           

Manual Index: 手工索引, 預設不會自動更新

synchronously同步更新 隻有建立索引時指定autoUpdate:true, 才會真正生效, 更新圖時性能上會有影響
       
apoc.autoIndex.enabled=<span class="hljs-keyword"><span class="hljs-keyword">true</span></span>  
           
asynchronously異步更新
apoc.autoIndex.async=<span class="hljs-keyword"><span class="hljs-keyword">true</span></span>  

預設的異步更新參數:<span class="hljs-number"><span class="hljs-number">50000</span></span> operations <span class="hljs-keyword"><span class="hljs-keyword">or</span></span> <span class="hljs-number"><span class="hljs-number">5000</span></span> milliseconds 觸發

apoc.autoIndex.queue_capacity=<span class="hljs-number"><span class="hljs-number">100000</span></span>
apoc.autoIndex.async_rollover_opscount=<span class="hljs-number"><span class="hljs-number">50000</span></span>
apoc.autoIndex.async_rollover_millis=<span class="hljs-number"><span class="hljs-number">5000</span></span>
apoc.autoIndex.tx_handler_stopwatch=<span class="hljs-keyword"><span class="hljs-keyword">false</span></span>
           
添加多個節點屬性縮影 配合search用, 重複執行會先删除再建立: apoc.index.addAllNodes('index-name',{label1:['prop1',…​],…​}, {options}) options的選擇(map形式給入):
type: fulltext/exact  全文索引/精确索引

to_lower_case: <span class="hljs-keyword"><span class="hljs-keyword">false</span></span>/<span class="hljs-keyword"><span class="hljs-keyword">true</span></span>

analyzer: classname   用哪種classname of lucene analyzer 

similarity: classname   相似度計算的方式 classname <span class="hljs-keyword"><span class="hljs-keyword">for</span></span> lucene similarity 

autoUpdate:  <span class="hljs-keyword"><span class="hljs-keyword">true</span></span>/<span class="hljs-keyword"><span class="hljs-keyword">false</span></span>  是否自動更新
           
添加一個節點的屬性索引(可以不存在這個屬性字段) apoc.index.addNode(node,['prop1',…​]) 對于給定的标簽,添加節點索引(索引名稱的Label和node可以不一緻): apoc.index.addNodeByLabel('Label',node,['prop1',…​]) 給索引命名 預設是Label作為名稱: apoc.index.addNodeByName('name',node,['prop1',…​]) apoc.index.addNodeMap(node,{key:value}) apoc.index.addNodeMapByName(index, node,{key:value}) 關系索引: apoc.index.addRelationship(rel,['prop1',…​]) apoc.index.addRelationshipByName('name',rel,['prop1',…​]) apoc.index.addRelationshipMap(rel,{key:value}) apoc.index.addRelationshipMapByName(index, rel,{key:value}) 删除節點索引 apoc.index.removeNodeByName('name',node) remove node from an index for the given name 索引模糊查詢(計算編輯距離) apoc.index.search('index-name', 'query') YIELD node, weight apoc.index.nodes('Label','prop:value*') YIELD node, weight apoc.index.relationships('TYPE','prop:value*') YIELD rel, weight 沒了解: apoc.index.between(node1,'TYPE',node2,'prop:value*') YIELD rel, weight 示例: match (p:Person) call apoc.index.addNode(p,["name","age"]) RETURN count(*); // 129s for 1M People
call apoc.index.nodes(<span class="hljs-string"><span class="hljs-string">'Person'</span></span>,<span class="hljs-string"><span class="hljs-string">'name:name100*'</span></span>) <span class="hljs-keyword"><span class="hljs-keyword">YIELD</span></span> node, weight <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> * limit <span class="hljs-number"><span class="hljs-number">2</span></span>
           

Index Management:

CALL apoc.index.remove('Thing') 

展示: CALL apoc.index.list()


CALL apoc.index.forNodes('name',{config}) YIELD type,name,config

              CALL apoc.index.forRelationships('name',{config}) YIELD type,name,config

           

Triggers : 觸發器

apoc.trigger.enabled=true
           

Locking: 鎖

call apoc.lock.nodes([nodes])

call apoc.lock.rels([relationships])

              call apoc.lock.all([nodes],[relationships])

           

Meta Graph: 展示節點, 關系标簽的概覽圖

CALL apoc.meta.graphSample()

CALL apoc.meta.graph


有選擇的展示一部分結果: CALL apoc.meta.subGraph({labels:[labels],rels:[rel-types],excludes:[label,rel-type,…​]})


表格形式展示資料: CALL apoc.meta.data


Map形式展示資料: CALL apoc.meta.schema

              快速檢視圖中各種存在的節點,邊: CALL apoc.meta.stats yield labelCount, relTypeCount, propertyKeyCount, nodeCount, relCount, labels, relTypes, stats

           

Sehema: 檢視各種索引, 限制

apoc.schema.assert({indexLabel:[indexKeys],…​},{constraintLabel:[constraintKeys],…​}, dropExisting : true) yield label, key, unique, action

apoc.schema.nodes() yield name, label, properties, status, type


apoc.schema.relationships() yield name, type, properties, status


apoc.schema.node.indexExists(labelName, properties)


apoc.schema.node.constraintExists(labelName, properties)

              apoc.schema.relationship.constraintExists(type, properties)

           

Streaming Data to Gephi: 導出資料到Gephi

apoc.gephi.add(url-or-key, workspace, data, weightproperty, ['exportproperty'])

</div>
           

原文位址:https://www.jianshu.com/p/851ab29420fd