Jaccard Подобие, как создать "ПОХОЖИЕ" отношения, используя writeRelationshipType - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь предложить ключевые слова, основанные на пороговой точке сходства ЖакараКонечной целью было бы использовать 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.

Спасибо большоемного,

Эрик

1 Ответ

0 голосов
/ 21 декабря 2018

Если вы хотите переписать отношение SIMILAR , вы должны использовать similarityCutoff: 0.1 или выше.Проверьте исходный код для получения дополнительной информации, почему.

Кроме того, ваш запрос MATCH немного отклонен, поэтому запрос на обратную запись должен выглядеть следующим образом:

MATCH (search_query:Title)-[:HAS_KEYWORDS]->(k_id:Keyword)

WITH {item:id(search_query), categories: collect(id(k_id))} as userData
WITH collect(userData) as data
CALL algo.similarity.jaccard(data, {topK: 1, similarityCutoff: 0.1, 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

Вы вводите идентификатор заголовка как item и идентификаторы всех ключевых слов, описывающих заголовок как категории, и позволяете алгоритму обрабатывать все остальное.

Теперь, когда вы сохранили отношения, вы можете выполнить запрос рекомендаций.

MATCH (p:Title {name: "T1"})-[:SIMILAR]->(other),
      (other)-[:HAS_KEYWORDS]->(keyword)  
WHERE not((p)-[:HAS_KEYWORDS]->(keyword))  
RETURN keyword.name AS keywords
...