日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

neo4j cypher_Neo4j:使用Cypher生成实时建议

發(fā)布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 neo4j cypher_Neo4j:使用Cypher生成实时建议 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

neo4j cypher

Neo4j的最常見用途之一是構(gòu)建實時推薦引擎,一個共同的主題是它們利用大量不同的數(shù)據(jù)來提出有趣的推薦。

例如, 在此視頻中, 阿曼達(Amanda)展示了約會網(wǎng)站如何通過社交聯(lián)系開始,然后介紹熱情,位置和其他一些東西,從而構(gòu)建實時推薦引擎。

Graph Aware有一個簡潔的框架 ,可以幫助您使用Java構(gòu)建自己的推薦引擎,我很好奇Cypher版本的外觀。

這是示例圖:

CREATE(m:Person:Male {name:'Michal', age:30}),(d:Person:Female {name:'Daniela', age:20}),(v:Person:Male {name:'Vince', age:40}),(a:Person:Male {name:'Adam', age:30}),(l:Person:Female {name:'Luanne', age:25}),(c:Person:Male {name:'Christophe', age:60}),(lon:City {name:'London'}),(mum:City {name:'Mumbai'}),(m)-[:FRIEND_OF]->(d),(m)-[:FRIEND_OF]->(l),(m)-[:FRIEND_OF]->(a),(m)-[:FRIEND_OF]->(v),(d)-[:FRIEND_OF]->(v),(c)-[:FRIEND_OF]->(v),(d)-[:LIVES_IN]->(lon),(v)-[:LIVES_IN]->(lon),(m)-[:LIVES_IN]->(lon),(l)-[:LIVES_IN]->(mum);

我們想向“亞當(dāng)”推薦一些潛在的朋友,因此我們查詢的第一層是找到他的朋友,因為其中肯定有一些潛在的朋友:

MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend) RETURN me, potentialFriend, COUNT(*) AS friendsInCommon==> +--------------------------------------------------------------------------------------+ ==> | me | potentialFriend | friendsInCommon | ==> +--------------------------------------------------------------------------------------+ ==> | Node[1007]{name:"Adam",age:30} | Node[1006]{name:"Vince",age:40} | 1 | ==> | Node[1007]{name:"Adam",age:30} | Node[1005]{name:"Daniela",age:20} | 1 | ==> | Node[1007]{name:"Adam",age:30} | Node[1008]{name:"Luanne",age:25} | 1 | ==> +--------------------------------------------------------------------------------------+ ==> 3 rows

該查詢?yōu)槲覀兲峁┝藵撛谂笥训牧斜硪约拔覀冇卸嗌賯€共同的朋友。

現(xiàn)在我們有了一些潛在的朋友,讓我們開始為他們每個人建立一個排名。 一個可以吸引潛在朋友的指標(biāo)是,如果他們和我們生活在同一地點,那么可以將其添加到查詢中:

MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend)WITH me, potentialFriend, COUNT(*) AS friendsInCommonRETURN me,potentialFriend,SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation==> +-----------------------------------------------------------------------------------+ ==> | me | potentialFriend | sameLocation | ==> +-----------------------------------------------------------------------------------+ ==> | Node[1007]{name:"Adam",age:30} | Node[1006]{name:"Vince",age:40} | 0 | ==> | Node[1007]{name:"Adam",age:30} | Node[1005]{name:"Daniela",age:20} | 0 | ==> | Node[1007]{name:"Adam",age:30} | Node[1008]{name:"Luanne",age:25} | 0 | ==> +-----------------------------------------------------------------------------------+ ==> 3 rows

接下來,我們將通過比較每個節(jié)點的標(biāo)簽來檢查Adams的潛在朋友是否與他具有相同的性別。 我們提供了“性別”和“性別”標(biāo)簽。

MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend)WITH me, potentialFriend, COUNT(*) AS friendsInCommonRETURN me,potentialFriend,SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation,LABELS(me) = LABELS(potentialFriend) AS gender==> +--------------------------------------------------------------------------------------------+ ==> | me | potentialFriend | sameLocation | gender | ==> +--------------------------------------------------------------------------------------------+ ==> | Node[1007]{name:"Adam",age:30} | Node[1006]{name:"Vince",age:40} | 0 | true | ==> | Node[1007]{name:"Adam",age:30} | Node[1005]{name:"Daniela",age:20} | 0 | false | ==> | Node[1007]{name:"Adam",age:30} | Node[1008]{name:"Luanne",age:25} | 0 | false | ==> +--------------------------------------------------------------------------------------------+ ==> 3 rows

接下來,讓我們計算亞當(dāng)和他的潛在朋友之間的年齡差異:

MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend)WITH me, potentialFriend, COUNT(*) AS friendsInCommonRETURN me,potentialFriend,SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation,abs( me.age - potentialFriend.age) AS ageDifference,LABELS(me) = LABELS(potentialFriend) AS gender,friendsInCommon==> +--------------------------------------------------------------------------------------+ ==> | me | potentialFriend | sameLocation | ageDifference | gender | friendsInCommon | ==> +--------------------------------------------------------------------------------------+ ==> | Node[1007]{name:"Adam",age:30} | Node[1006]{name:"Vince",age:40} | 0 | 10.0 | true | 1 | ==> | Node[1007]{name:"Adam",age:30} | Node[1005]{name:"Daniela",age:20} | 0 | 10.0 | false | 1 | ==> | Node[1007]{name:"Adam",age:30} | Node[1008]{name:"Luanne",age:25} | 0 | 5.0 | false | 1 | ==> +--------------------------------------------------------------------------------------+ ==> 3 rows

現(xiàn)在,讓我們進行一些過濾,以擺脫與亞當(dāng)已經(jīng)成為朋友的人–推薦這些人沒有多大意義!

MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend)WITH me, potentialFriend, COUNT(*) AS friendsInCommonWITH me,potentialFriend,SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation,abs( me.age - potentialFriend.age) AS ageDifference,LABELS(me) = LABELS(potentialFriend) AS gender,friendsInCommonWHERE NOT (me)-[:FRIEND_OF]-(potentialFriend)RETURN me,potentialFriend,SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation,abs( me.age - potentialFriend.age) AS ageDifference,LABELS(me) = LABELS(potentialFriend) AS gender,friendsInCommon==> +---------------------------------------------------------------------------------------+ ==> | me | potentialFriend | sameLocation | ageDifference | gender | friendsInCommon | ==> +---------------------------------------------------------------------------------------+ ==> | Node[1007]{name:"Adam",age:30} | Node[1006]{name:"Vince",age:40} | 0 | 10.0 | true | 1 | ==> | Node[1007]{name:"Adam",age:30} | Node[1005]{name:"Daniela",age:20} | 0 | 10.0 | false | 1 | ==> | Node[1007]{name:"Adam",age:30} | Node[1008]{name:"Luanne",age:25} | 0 | 5.0 | false | 1 | ==> +---------------------------------------------------------------------------------------+ ==> 3 rows

在這種情況下,我們實際上并未將任何人過濾掉,但是對于其他一些人,我們會看到潛在朋友數(shù)量的減少。

我們的最后一步是為每個我們認(rèn)為對提出朋友建議很重要的功能評分。

如果人們居住在與亞當(dāng)相同的地方或性別相同,我們將給滿分10分,否則給0分。 對于ageDifference和friendsInCommon,我們將應(yīng)用對數(shù)曲線,以使這些值不會對我們的最終分?jǐn)?shù)產(chǎn)生不成比例的影響。 我們將使用ParetoScoreTransfomer中定義的公式來執(zhí)行此操作:

public <OUT> float transform(OUT item, float score) {if (score < minimumThreshold) {return 0;}double alpha = Math.log((double) 5) / eightyPercentLevel;double exp = Math.exp(-alpha * score);return new Double(maxScore * (1 - exp)).floatValue();}

現(xiàn)在,對于我們完整的推薦查詢:

MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend)WITH me, potentialFriend, COUNT(*) AS friendsInCommonWITH me,potentialFriend,SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation,abs( me.age - potentialFriend.age) AS ageDifference,LABELS(me) = LABELS(potentialFriend) AS gender,friendsInCommonWHERE NOT (me)-[:FRIEND_OF]-(potentialFriend)WITH potentialFriend,// 100 -> maxScore, 10 -> eightyPercentLevel, friendsInCommon -> score (from the formula above)100 * (1 - exp((-1.0 * (log(5.0) / 10)) * friendsInCommon)) AS friendsInCommon,sameLocation * 10 AS sameLocation,-1 * (10 * (1 - exp((-1.0 * (log(5.0) / 20)) * ageDifference))) AS ageDifference,CASE WHEN gender THEN 10 ELSE 0 END as sameGenderRETURN potentialFriend,{friendsInCommon: friendsInCommon,sameLocation: sameLocation,ageDifference:ageDifference,sameGender: sameGender} AS parts,friendsInCommon + sameLocation + ageDifference + sameGender AS score ORDER BY score DESC==> +---------------------------------------------------------------------------------------+ ==> | potentialFriend | parts | score | ==> +---------------------------------------------------------------------------------------+ ==> | Node[1006]{name:"Vince",age:40} | {friendsInCommon -> 14.86600774792154, sameLocation -> 0, ageDifference -> -5.52786404500042, sameGender -> 10} | 19.33814370292112 | ==> | Node[1008]{name:"Luanne",age:25} | {friendsInCommon -> 14.86600774792154, sameLocation -> 0, ageDifference -> -3.312596950235779, sameGender -> 0} | 11.55341079768576 | ==> | Node[1005]{name:"Daniela",age:20} | {friendsInCommon -> 14.86600774792154, sameLocation -> 0, ageDifference -> -5.52786404500042, sameGender -> 0} | 9.33814370292112 | ==> +----------------------------------------------------------------------------------------+

最終查詢還不錯-唯一真正復(fù)雜的部分是對數(shù)曲線計算。 用戶定義的功能將在將來發(fā)揮作用。

這種方法的好處是我們不必走出密碼的道路,因此,如果您對Java不滿意,仍然可以進行實時建議! 另一方面,推薦引擎的不同部分混合在一起,因此要查看整個管道并不像使用圖形感知框架那樣容易。

下一步是將其應(yīng)用于Twitter圖形,并在此提供關(guān)注者建議。

翻譯自: https://www.javacodegeeks.com/2015/03/neo4j-generating-real-time-recommendations-with-cypher.html

neo4j cypher

總結(jié)

以上是生活随笔為你收集整理的neo4j cypher_Neo4j:使用Cypher生成实时建议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲五码在线 | 中文字幕一区二区久久人妻网站 | 国产美女毛片 | 狠狠躁18三区二区一区传媒剧情 | 日韩精品――中文字幕 | 999成人网| 亚洲无码高清精品 | 无码成人精品区在线观看 | 欧美成人手机在线视频 | 2021狠狠干 | 成人影片在线免费观看 | www.4虎| 色国产精品 | 91精品国产综合久久久久久 | 日韩精品一区二区三区不卡在线 | 亚洲狠狠婷婷综合久久久久图片 | 好吊视频在线观看 | 火影黄动漫免费网站 | 男女视频在线免费观看 | 天堂伊人网 | 日韩一区二区三区在线 | 黄色xxxxxx| 精品在线99| 亚洲av电影天堂男人的天堂 | 日本呦呦 | 3d毛片 | 中文字幕国产日韩 | 在线日本中文字幕 | 香蕉久久精品日日躁夜夜躁 | 视频在线观看免费 | 国产福利短视频 | av天堂永久资源网 | 日本a v在线播放 | 一级视频在线播放 | 天天舔天天插 | 91黄色免费版 | 天干夜夜爽爽日日日日 | 最新久久 | 青青操免费在线视频 | 凹凸精品一区二区三区 | 91在线视频在线观看 | 在线观看免费观看 | 免费在线一区二区三区 | 超碰在线免费97 | 床戏高潮做进去大尺度视频网站 | 清清草免费视频 | 91在线播放国产 | 中国少妇高潮 | 中文字幕无人区二 | 一个人在线观看www软件 | 丁香花国语版普通话 | 精品三级网站 | 国产视频三区 | 色婷婷丁香| 九九九在线视频 | 九九九免费| 国产午夜大片 | 亚洲伊人成人网 | 亚洲天堂av线 | 色婷网 | 日本欧美亚洲 | 欧美成人综合在线 | 日批视频在线看 | 美丽姑娘免费观看在线观看 | 在线看黄网址 | 超碰在线视屏 | 国产一区二区小说 | 日本免费一区二区三区最新 | 国产一区二区三区视频在线播放 | 国产视频1区 | 美女的隐私免费看 | 国产精品嫩草69影院 | 国模av| 日日夜夜精品 | 在线观看一二区 | 私人影院毛片 | 4444亚洲人成无码网在线观看 | 亚洲一本之道 | 欧美日韩成人免费 | 性插视频在线观看 | 射美女 | 国产欧美在线 | 久久久无码精品亚洲国产 | 国产a视频精品免费观看 | 邻居少妇张开双腿让我爽一夜 | 超碰中文字幕在线 | 亚洲GV成人无码久久精品 | 欧美视频你懂的 | av中文字幕在线免费观看 | 日韩avav | 国产在线观看免费 | 国产噜噜噜噜久久久久久久久 | 风流少妇按摩来高潮 | 在线欧美一区二区 | 91亚洲综合 | 婷婷综合另类小说色区 | 影音先锋在线视频观看 | 国产日韩在线播放 | 啪啪免费av |