Как получить друзей друзей, которые имеют те же интересы?

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

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

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

Рисование графика


person rball    schedule 31.03.2012    source источник


Ответы (3)


Вам просто нужно расширить обход гремлина, чтобы также пройти по краям 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% правильной, поскольку вы не указали направление ребер на своей диаграмме.

person Pridkett    schedule 31.03.2012
comment
Извините, я забыл добавить стрелки, это помогло бы. В моей модели FRIEND является двунаправленным, а LIKE начинается с узла User и заканчивается узлом Language. Итак, это сработало: g.v(1).in('FRIEND').in('FRIEND').filter{it != g.v(1)}.dedup().as('fof').out('LIKES' ).in('Нравится').filter{it == g.v(1)}.back('fof').dedup() - person rball; 03.04.2012

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

START s=node(Joe)
MATCH s-[:FRIEND]-()-[:FRIEND]-fof, s-[:LIKES]-()-[:LIKES]-fof
WHERE s != fof
RETURN fof
person Josh Adell    schedule 31.03.2012
comment
Я использую neo4jClient, поэтому я могу попробовать это, если не смогу заставить работать другой. Спасибо - person rball; 01.04.2012

Запрос, чтобы получить общих друзей, не учитывая общие лайки, но если у вас есть общие лайки, это будет на первом месте. Взгляните на 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;

Если вы хотите только общие лайки, добавьте foll. условие -

Where sameInterest>0
person Abhi    schedule 14.06.2018