Cypher Neo4j - ранжировать похожие объекты на основе одинаковых отношений

На изображении вы видите узлы P одного типа, все они связаны с узлами типа C. Это просто общий вид с небольшим количеством деталей, но все объекты имеют идентификатор параметра. Допустим, у меня есть P1 с разными шаблонами отношений, то есть с C1-C5... Как я могу затем получить похожие объекты типа P, которые имеют одинаковые отношения и ранг по количеству похожих отношений...

Результат, который я хотел бы получить, основан на том, что у меня есть P1 с известным HasProperty для C1 ранжированным результатом как:

P2, имеет 4 подобных отношения, а также имеет C1
P3, имеет 3 подобных отношения, а также имеет C1
P4, имеет 2 подобных отношения, а также имеет C1

Cypher Neo4j - ранжировать похожие объекты на основе одинаковых отношений

Спасибо!

что значит "подобные отношения"? Есть ли у них общие отношения с одним и тем же идентификатором hasProperty ID?

Christophe Willemsen 26.12.2020 13:03

Привет, да, именно так, а затем ранжируйте результат на основе количества «похожих отношений» (с тем же типом и таким же идентификатором hasProperty)

user3154653 26.12.2020 13:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая следующий график:

CREATE (p1:P {id: 'p1'})
CREATE (p2:P {id: 'p2'})
CREATE (p3:P {id: 'p3'})
CREATE (c1:C {id: 'c1'})
CREATE (c2:C {id: 'c2'})
CREATE (c3:C {id: 'c3'})
CREATE (c4:C {id: 'c4'})
CREATE (p1)-[:RELA {hasProperty: 1}]->(c1)
CREATE (p1)-[:RELA]->(c2)
CREATE (p1)-[:RELA]->(c3)
CREATE (p1)-[:RELA]->(c4)
CREATE (p2)-[:RELA {hasProperty: 1}]->(c1)
CREATE (p2)-[:RELA]->(c2)
CREATE (p2)-[:RELA]->(c3)
CREATE (p2)-[:RELA]->(c4)
CREATE (p3)-[:RELA]->(c2)
CREATE (p3)-[:RELB]->(c3)
CREATE (p3)-[:RELA]->(c4)

Вы можете вернуть, учитывая p1, для каждого из p2, p3 два списка логических значений, один для одного типа отношений, один для одного и того же значения hasProperty:

MATCH (n:P)-[r1]->(c)<-[r2]-(other)
WHERE n.id = 'p1'
WITH other.id AS otherId, 
collect(r1.hasProperty = r2.hasProperty) AS sameHasProperty, 
collect(type(r1) = type(r2)) AS sameType
RETURN *

╒═════════╤═════════════════╤═════════════════════╕
│"otherId"│"sameHasProperty"│"sameType"           │
╞═════════╪═════════════════╪═════════════════════╡
│"p3"     │[]               │[true,false,true]    │
├─────────┼─────────────────┼─────────────────────┤
│"p2"     │[true]           │[true,true,true,true]│
└─────────┴─────────────────┴─────────────────────┘

Затем вы можете дать оценку истинности или ложности в каждой коллекции.

Допустим, аналогичные показатели hasProperty равны 2,0, а аналогичные значения типов отношений — 1,0:

MATCH (n:P)-[r1]->(c)<-[r2]-(other)
WHERE n.id = 'p1'
WITH other.id AS otherId, 
collect(r1.hasProperty = r2.hasProperty) AS sameHasProperty, 
collect(type(r1) = type(r2)) AS sameType
RETURN otherId, (size([x IN sameHasProperty WHERE x = true])*2.0 + size([x IN sameType WHERE x = true])*1.0) AS score
ORDER BY score DESC

╒═════════╤═══════╕
│"otherId"│"score"│
╞═════════╪═══════╡
│"p2"     │6.0    │
├─────────┼───────┤
│"p3"     │2.0    │
└─────────┴───────┘

Спасибо, Кристоф... Это решает мой сценарий. Предположим, что отношение (r1 и r2 в вашем примере) не имеет никакого свойства, но у C-узлов есть одно, называемое Id... Тогда это та же самая настройка, но я могу пропустить первый оператор сбора "collect(r1.hasProperty = r2 .hasProperty) AS sameHasProperty" или ?

user3154653 26.12.2020 19:15

Что ж, поскольку шаблон на узле C уже совпал, у них наверняка будет одинаковый c.id

Christophe Willemsen 26.12.2020 19:24

Другие вопросы по теме