【问题标题】:Neo4j : Label Propagation with seed labelsNeo4j:带有种子标签的标签传播
【发布时间】:2020-06-29 20:07:56
【问题描述】:

我想在 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 个节点的网络,并使用 cypher 投影将二分图投影到单分图。在下一步中,我运行了标签传播算法。这是代码:

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”。

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

【问题讨论】:

  • 请在代码块中编写代码,而不是对代码进行图像处理。
  • 你好,我编辑了。

标签: neo4j graph-algorithm


【解决方案1】:

您需要将种子属性添加到文章。如果你看documentation你会注意到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 个社区。​​p>

【讨论】:

  • 非常感谢您的回答。我要试试。是否有另一种方法可以使用 Neo4j 进行半监督学习,以仅拥有带有我选择的标签的社区?
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2018-06-28
  • 1970-01-01
  • 2017-11-21
  • 2021-04-25
相关资源
最近更新 更多