Как завести друзей у друзей, которые имеют одинаковый интерес? - PullRequest
2 голосов
/ 31 марта 2012

Дружить с друзьями довольно легко, я получил это, которое, кажется, прекрасно работает.

g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}

Но то, что я хочу сделать, - это завести друзей только у друзей, которые имеют одинаковые интересы. Ниже я хочу, чтобы Джо предложили Мо, а не Но, потому что они не имеют одинакового интереса.

Drawing of graph

Ответы [ 3 ]

3 голосов
/ 01 апреля 2012

Вам просто нужно расширить свой обход gremlin, чтобы пройти через края LIKES:

g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}.dedup() \
       as('friend').in('LIKES').out('LIKES').filter{it == g.v(1)}. \
       back('friend').dedup()

В основном это распространяется на друзей друзей, как вы это делали раньше, и сохраняет позицию в трубе подимя friend.Затем он переходит к взаимным лайкам и ищет исходный узел источника.Если он найдет его, он отскочит назад friend.dedup() просто удаляет дубликаты и может ускорить обходы.

Направленность этого может быть не на 100% правильной, поскольку вы не указали направление ребер на диаграмме.

2 голосов
/ 31 марта 2012

Это должно быть в Гремлин? Если Cypher приемлем, вы можете сделать:

START s=node(Joe)
MATCH s-[:FRIEND]-()-[:FRIEND]-fof, s-[:LIKES]-()-[:LIKES]-fof
WHERE s != fof
RETURN fof
0 голосов
/ 14 июня 2018

Запрашивайте взаимных друзей, не считая общих симпатий, но если у вас есть общие лайки, это победит.Взгляните на Order by.

    MATCH (me:User{userid:'34219'}) 
    MATCH (me)-[:FRIEND]-()-[:FRIEND]-(potentialFriend)
    WITH me, potentialFriend,  COUNT(*) AS friendsInCommon
    WITH me,
         potentialFriend,
         SIZE((potentialFriend)-[:LIKES]->()<-[:LIKES]-(me)) AS sameInterest, 
         friendsInCommon
    WHERE NOT (me)-[:FRIEND]-(potentialFriend)
    RETURN potentialFriend, sameInterest, friendsInCommon, 
    friendsInCommon + sameInterest AS score
    ORDER BY score DESC;

Если вам нужны только обычные лайки, добавьте фолл.состояние -

Where sameInterest>0
...