首页 > 解决方案 > Neo4j:带有种子标签的标签传播

问题描述

我想使用种子标签和权重属性将标签传播应用于我在 Neo4j 中的数据。我的数据看起来像图像。

在此处输入图像描述

关系“Appears_in”具有权重属性(整数,如图像中的 8),某些文章节点具有种子标签属性(字符串,例如 Iphone)。

我想传播这个种子标签以创建包含相同主题的文章的集群,例如 Iphone 集群。更准确地说,我想将种子标签传播到另一个文章节点,但文章之间没有直接关系。他们通过交流中的话语“在某个地方”连接起来……

首先,我运行弱连接组件,以保持我的数据中唯一的一个大网络:

CALL gds.wcc.stream('lpa_test') 
YIELD nodeId, componentId 
RETURN componentId, count(*) as size 
ORDER BY size DESC 
LIMIT 1000

在此处输入图像描述

因此,我尝试让网络保持 2170 个节点,并使用密码投影将二分图投影到单分图。在下一步中,我运行了标签传播算法。这是代码:

CALL gds.labelPropagation.write({
  nodeQuery:"MATCH (n:ARTICLE) WHERE n.familyComponent = 0 
             RETURN id(n) as id",
  relationshipQuery:"MATCH (a:Article)<-[:APPEARS_IN]-(b:KEYWORD)-[:APPEARS_IN]->(c:Article) 
                     RETURN id(a) as source, id(c) as target, count(distinct b) as word_weight",
  relationshipWeightProperty: "word_weight",
  writeProperty: "lpa"})

结果并不好。

我想给标签传播算法提供种子标签(字符串)和权重(关系中的)。

我想要几个集群(如果我有 5 个种子标签(字符串),我想 5 个集群)

我有 5 个带有种子标签(字符串)的节点,我想通过网络传播这些种子标签。

例如:5 个种子标签(字符串)将是“Iphone”、“Coronavirus”、“Disney”、“Crisis”、“Summer”。

如何编写标签传播来传播这些种子标签(字符串)?

标签: neo4jgraph-algorithm

解决方案


您需要将种子属性添加到文章中。如果您查看文档,您会注意到seedProperty参数的描述是:

seedProperty:用于定义初始标签集(必须是数字)。

这意味着您不能将字符串用作种子标签,但您必须创建一个将字符串映射到整数的映射函数。在您的情况下,可能类似于:

  • 苹果手机:1
  • 冠状病毒:2
  • 迪士尼:3
  • 危机:4
  • 夏季:5

将种子标签(整数)添加到节点后,您可以运行以下查询来执行种子标签传播算法。您必须在中添加种子属性并使用参数nodeQuery定义它。seedProperty

CALL gds.graph.create({
  nodeQuery: "MATCH (n:Article) WHERE n.familyComponent = 0
              RETURN id(n) as id, n.seedLabel as seedLabel",
  relationshipQuery:"MATCH (a:Article)<-[:APPEARS_IN]-(b:KEYWORD)-[:APPEARS_IN]->(c:Article)
                     RETURN id(a) as source, id(c) as target, count(distinct b) as word_weight",
  relationshipWeightProperty:'word_weight',
  seedProperty:'seedLabel',
  writeProperty:'lpa'

})

这应该有效。需要注意的一点是,如果您没有为图中的所有节点使用种子属性,结果可能包含五个以上的标签。该文档指出:

该算法首先检查是否有分配给节点的种子标签。如果不存在种子标签,则为节点分配一个新的唯一标签。使用这组初步的标签,它然后将每个节点的标签顺序更新为一个新的标签,这是在标签传播的每次迭代中其邻居中最频繁的标签。

例如,如果您只为 50% 的节点分配种子标签,则其他 50% 的节点将使用随机唯一标签启动。反过来,这意味着您最终可能会拥有超过 5 个社区。


推荐阅读