На изображении вы видите узлы P одного типа, все они связаны с узлами типа C. Это просто общий вид с небольшим количеством деталей, но все объекты имеют идентификатор параметра. Допустим, у меня есть P1 с разными шаблонами отношений, то есть с C1-C5... Как я могу затем получить похожие объекты типа P, которые имеют одинаковые отношения и ранг по количеству похожих отношений...
Результат, который я хотел бы получить, основан на том, что у меня есть P1 с известным HasProperty для C1 ранжированным результатом как:
P2, имеет 4 подобных отношения, а также имеет C1
P3, имеет 3 подобных отношения, а также имеет C1
P4, имеет 2 подобных отношения, а также имеет C1
Спасибо!
Привет, да, именно так, а затем ранжируйте результат на основе количества «похожих отношений» (с тем же типом и таким же идентификатором hasProperty)
Учитывая следующий график:
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" или ?
Что ж, поскольку шаблон на узле C уже совпал, у них наверняка будет одинаковый c.id
что значит "подобные отношения"? Есть ли у них общие отношения с одним и тем же идентификатором hasProperty ID?