Я пытаюсь предложить ключевые слова, основанные на пороговой точке сходства ЖакараКонечной целью было бы использовать py2neo и вызывать этот запрос всякий раз, когда пользователь хочет рекомендовать ключевые слова.Мое обоснование:
(Title1)-[:HAS_KEYWORDS]->(Keyword1)<-[:HAS_KEYWORDS]-(Title2)-[:HAS_KEYWORDS]->(Keyword2)
Я следовал примеру, найденному в справочнике:
https://neo4j.com/docs/graph-algorithms/current/algorithms/similarity-jaccard/
Представление моих данных выглядит следующим образом: Представление моих тестовых данных CSV-файловследующим образом: CSV используется для создания всех узлов титров:
title_id,title
T1,Article Title 1
T2,Article Title 2
CSV, которые я хочу использовать для создания отношений:
title_id,keyword_id,keyword
T1,K1,aaa
T1,K2,bbb
T1,K3,ccc
T1,K4,ddd
T2,K1,aaa
T2,K5,eee
T2,K6,fff
T2,K4,ddd
В настоящее время я нахожусь в точке, где я вычисляюсходство:
Я попробовал следующее:
MATCH (search_query:Title)-[:HAS_KEYWORDS]->(k_id:Keyword)
<-[:HAS_KEYWORDS]-(return_query:Title)-[r2:HAS_KEYWORDS]->(rec_k:Keyword)
WITH {item:id(return_query), categories: collect(id(rec_k))} as userData
WITH collect(userData) as data
CALL algo.similarity.jaccard.stream(data, {similarityCutoff: 0.0})
YIELD item1, item2, count1, count2, intersection, similarity
RETURN algo.getNodeById(item1) AS from, algo.getNodeById(item2) AS to, intersection, similarity ORDER BY similarity DESC
Однако, продолжая этот пример, в примере используется другой запрос, который я также пытался повторить:
MATCH (search_query:Title)
-[:HAS_KEYWORDS]->(k_id:Keyword)
<-[:HAS_KEYWORDS]-(return_query:Title)
-[r2:HAS_KEYWORDS]->(rec_k:Keyword)
WITH {item:id(return_query), categories: collect(id(rec_k))} as userData
WITH collect(userData) as data
CALL algo.similarity.jaccard(data, {topK: 1, similarityCutoff: 0.0, write:true})
YIELD nodes, similarityPairs, write, writeRelationshipType, writeProperty, min, max, mean, stdDev, p25, p50, p75, p90, p95, p99, p999, p100
RETURN nodes, similarityPairs, write, writeRelationshipType, writeProperty, min, max, mean, p95
Я пытаюсь перейти к следующему шагу и запросить ПОХОЖУЮ связь,
, но, проверяя свои результаты, я обнаруживаю, что подобное отношение не было создано в моем тестовом графике.Таким образом, мой первый вопрос будет таким: Q: Почему на моем графике не появляется отношение SIMILAR?
(Смежный подвопрос: я считаю, что моя логика MATCH будет искать все заголовки, которые имеют хотя бы одно общее ключевое слово с другимзаголовок, другой заголовок также должен содержать хотя бы одно не относящееся к делу ключевое слово. Если я буду использовать второй пример, смогу ли я создать только одно ПОХОЖИЕ отношения?)
Мой второй вопрос будет связан с моимконечная цель.В: Если я правильно понимаю запрос, только наиболее похожий результат будет иметь отношение ПОХОЖУЕ в базе данных;я смогу использовать тот же запрос внутри функции?В настоящее время моя функция выглядит примерно так:
def get_similar_keywords(self):
'''
MATCH (search_query:Title)
-[:HAS_KEYWORDS]->(k_id:Keyword)
<-[:HAS_KEYWORDS]-(return_query:Title)
-[r2:HAS_KEYWORDS]->(rec_k:Keyword)
WITH {item:id(return_query), categories: collect(id(rec_k))} as userData
WITH collect(userData) as data
CALL algo.similarity.jaccard(data, {topK: 1, similarityCutoff: 0.0, write:true})
YIELD nodes, similarityPairs, write, writeRelationshipType, writeProperty, min, max, mean, stdDev, p25, p50, p75, p90, p95, p99, p999, p100
RETURN nodes, similarityPairs, write, writeRelationshipType, writeProperty, min, max, mean, p95
'''
return graph.run(query, username=self.username)
Прямо сейчас мои цели состоят в том, чтобы выяснить: 1. Если моя идея, лежащая в основе условий MATCH, неверна;2. Как создать ПОХОЖУЮ связь, используя тип отношения записи, и 3. Узнайте, можно ли повторно использовать эти запросы.
В настоящее время после игры с переменными.Я думаю, что у меня есть значения сходства Jaccard, которые выглядят правильно:
╒════════════════════════╤═══════╤═══════════════════════╤═══════════════╤═> ══════════════════╤══════════════════╤══════════════════╤══════════════════╕ │ "узлы" │ "схожесть пар" │ "запись" │ "writeRelationshipType" │ "writeProperty" │ "> мин" │ "max "│" означает "│" p95 "│ ╞═══════╪═════════════════╪═══════╪═══════════════════════╪═══════════════╪═> ══════════════════╪═════════════════╪══════════════════╪══════════════════╡ │7 │5 │false │ "SIMILAR"Score "оценка"> │0.01162785291671753│0.5844191908836365│0.2831512808799744│0.584419190883636> 5│ └───────┴─────┴────────────────────────────────────────────┴───────────────────────┴───────────────┴─> ──────────────────┴──────────────────┴──────────────────┴──────────────────┘
Я просто не совсем понимаю, почему он показывает «ПОХОЖИЕ», но на графике ничего не отображается ...
Если я на правильном пути, я хотел бы повторить этот код:
MATCH (p:Person {name: "Praveena"})-[:SIMILAR]->(other),
(other)-[:LIKES]->(cuisine)
WHERE not((p)-[:LIKES]->(cuisine))
RETURN cuisine.name AS cuisine
... и вернуть рекомендуемые ключевые слова через py2neo.
Спасибо большоемного,
Эрик