Graph 在连续更新的数据上使用algo.similarity.jaccard时防止重复的相似关系

Graph 在连续更新的数据上使用algo.similarity.jaccard时防止重复的相似关系,graph,neo4j,similarity,Graph,Neo4j,Similarity,我正在使用Neo4j graph算法库中的algo.similarity.Jaccard算法计算图中一类节点的Jaccard相似性指数。计算Jaccard相似度并指示截止点后,我将度量存储在节点之间的关系中(这是算法的一个功能)。当我获得新数据添加到图表中时,我试图看到图表随时间的变化(我将用新数据重新加载我的CSV文件,并合并到新节点/关系中) 我预见到的一个问题是,一旦我使用更新的图形再次运行Jaccard算法,它将创建重复的关系。这是我正在使用的代码的Neo4j文档示例: MATCH (p

我正在使用Neo4j graph算法库中的
algo.similarity.Jaccard
算法计算图中一类节点的Jaccard相似性指数。计算Jaccard相似度并指示截止点后,我将度量存储在节点之间的关系中(这是算法的一个功能)。当我获得新数据添加到图表中时,我试图看到图表随时间的变化(我将用新数据重新加载我的CSV文件,并合并到新节点/关系中)

我预见到的一个问题是,一旦我使用更新的图形再次运行Jaccard算法,它将创建重复的关系。这是我正在使用的代码的Neo4j文档示例:

MATCH (p:Person)-[:LIKES]->(cuisine)
WITH {item:id(p), categories: collect(id(cuisine))} 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

是否有一种方法可以指定我不希望每次使用更新的图形运行此代码时都有重复的关系?手动操作时,我会使用MERGE而不是CREATE,但鉴于这是一个来自库的算法,我不知道该怎么做。仅供参考,我将无法向库插件添加更改,而且似乎无法将关系存储在不同的标签下,例如相似性2。

至少有两种方法可以避免多次调用
算法相似性。jaccard

  • 在每次调用之前删除现有关系(默认情况下,它们具有类似的
    类型)。这可能是最简单的方法

  • 在进行调用时,省略
    write:true
    选项(这样该过程就不会创建任何关系),然后编写自己的密码来选择性地创建不存在的关系(使用
    MERGE

  • [更新]

    下面是第二种方法的示例(使用
    algo.similarity.jaccard.stream
    过程的变体,它为我们提供了更有用的值):

    MATCH(p:Person)-[:LIKES]->(烹饪)
    使用{item:id(p),categories:collect(id(courine))}作为用户数据
    使用collect(userData)作为数据
    调用algo.similarity.jaccard.stream(数据,{topK:1,similarityCutoff:0.1})
    产量项目1,项目2,相似性
    其中第1项<第2项
    将算法getNodeById(item1)作为n1,将算法getNodeById(item2)作为n2,相似性
    合并(n1)-[s:类似]-(n2)
    设置s.score=相似性
    返回*
    

    由于该过程将两次返回相同的节点对(具有相同的
    相似性
    分数),因此使用
    WHERE
    子句过滤掉其中一个节点对,以加快处理速度。
    algo.getNodeById()
    实用函数用于通过节点的本机ID获取节点。
    MERGE
    子句的关系模式没有为
    score
    指定值,因此它将匹配现有关系,即使该关系具有不同的值。用于设置
    分数的
    SET
    子句位于
    MERGE
    之后,这也有助于确保值是最新的

    我正在研究选项2,但在计算合并查询时遇到了一些困难。例如,我想做一些类似于MERGE(p1)-[:similor{score:similarity}]-(p2)的事情,但是如果我在RETURN语句之前的代码中包含了节点,则不会定义节点。关于如何创建关系有什么建议吗?我可以做选项2,但它创建了重复的节点。信息是正确的,它只是创造了比它应有的更多。它没有给我与“写”功能相同的结果。我用这个大纲调整了我的代码,它成功了。我也理解你的建议如何防止重复。非常感谢。伟大的还请记住,答案最适合你。@cybersam,这里是第1项
    MATCH (p:Person)-[:LIKES]->(cuisine)
    WITH {item:id(p), categories: collect(id(cuisine))} as userData
    WITH collect(userData) as data
    CALL algo.similarity.jaccard.stream(data, {topK: 1, similarityCutoff: 0.1})
    YIELD item1, item2, similarity
    WHERE item1 < item2
    WITH algo.getNodeById(item1) AS n1, algo.getNodeById(item2) AS n2, similarity
    MERGE (n1)-[s:SIMILAR]-(n2)
    SET s.score = similarity
    RETURN *