簡體   English   中英

計算Neo4j中節點之間的相似性

[英]Compute Similarity between nodes in Neo4j

我有下表說明每個Originator執行的任務的頻率。 (請參閱附圖)。

每個發起者的任務頻率

我在Neo4j中使用Originator - [Frequency] - > Task的關系表示了上表。

現在我需要僅使用Cypher查詢來計算兩個用戶之間的相似性(例如,Jaccard相似性)。 想知道它是如何可能的,或者是否會完全改變模式定義。

提前致謝。

這更像是一個起點,然后是一個答案! 如果我們首先忽略頻率的值,那么我認為你可以嘗試這樣的事情:

MATCH (u1:Originator{name:'John'}), (u2:Originator{name:'Sue'})
WITH u1, u2
OPTIONAL MATCH common=(u1)-[:FREQUENCY]->(t:Task)<-[:FREQUENCY]-(u2)
WITH u1, u2, COUNT(common) as intersection
OPTIONAL MATCH (u1)-[:FREQUENCY]->(t:Task)
WITH u1, u2, intersection, COLLECT(DISTINCT t) AS t1s
OPTIONAL MATCH (u2)-[:FREQUENCY]->(t:Task)
WHERE NOT t IN t1s
WITH u1, u2, intersection, t1s + COLLECT(DISTINCT t) AS union
RETURN u1, u2, intersection / union as js

這絕對是未經測試的,並且可能通過某種方式找不到重復匹配任務的效率。

查詢正在做的是找到兩個用戶共有的任務,並將常見任務的數量存儲在變量intersection 然后它使用單獨匹配(可選)每個用戶的任務並使用它們來計算unionCOLLECT將創建零長度數組,其中零匹配)。 在最終的回報聲明中可能存在零除問題。

頻率如何影響結果很難說,我想知道你是否會通過交換更好地服務:Frequency :Completed並為每個完成的任務創建一個新的關系(即'John'和'Act A'之間的6個關系)。 這對於支持intersection非常有用,但對於Union來說仍然會有一些有趣的內涵。

該鏈接解決了我的問題。 只需要考慮每個環節。

http://neo4j.com/docs/stable/cypher-cookbook-similarity-calc.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM