0

我是 Neo4j 的新手。我正在尝试从二部图创建单部投影。我只有两种类型的节点:

  • 帖子节点(绿色):这些都是内容片段,例如推文、reddit 帖子、新闻文章等。
  • 实体节点(棕色):这些是与内容关联的实体

在此处输入图像描述

我的挑战是我有一些不同的关系。一些例子:

  • (e1:Entity)-[r:TWEETED]->(p:Post)->[r:AT_MENTIONED]->(e2:Entity)
  • (e1:Entity)-[r:TWEETED]->(p1:Post)-->[r:QUOTE_TWEETED]->(p2:Post)<-[r:TWEETED]<-(e2:Entity)
  • (e1:Entity)-[r:PUBLISHED]->(p:Post)-[r:MENTIONS]->(e2:entity)

我想做的是

  1. 将其更改为仅具有实体但基于所有类型的关系推断 RELATED_TO 边缘的单部分图投影,而不仅仅是单一类型的关系和
  2. 根据两个实体同时出现的次数分配边缘权重。

换句话说,使用上面的例子:

示例 1

  • 之前:(e1:Entity)-[r:TWEETED]->(p:Post)->[r:AT_MENTIONED]->(e2:Entity)
  • 之后:(e1:实体)-[r:RELATED_TO]-(e2:实体)

示例 2

  • 之前:(e1:Entity)-[r:TWEETED]->(p1:Post)-->[r:QUOTE_TWEETED]->(p2:Post)<-[r:TWEETED]<-(e2:Entity)
  • 之后:(e1:实体)-[r:RELATED_TO]-(e2:实体)

示例 3

  • 之前:(e1:Entity)-[r:PUBLISHED]->(p:Post)-[r:MENTIONS]->(e2:entity)
  • 之后:(e1:实体)-[r:RELATED_TO]-(e2:实体)

我可以在网上找到仅将一种类型的关系转换为单方关系的示例,但似乎无法为具有不同类型的中间节点(即实体节点之间的两个后节点)的多个关系或关系获得任何工作。我已经完成了图形数据科学培训,但也找不到我想要的东西。

有什么建议吗?

4

1 回答 1

1

这个查询对你有用吗?

MATCH (e1:Entity)-[*2..3]-(e2:Entity)
WHERE id(e1) < id(e2)
WITH e1, e2, count(*) as strength
MERGE (e1)-[r:RELATED_TO]->(e2) 
SET r.strength = strength

由于我们没有为 e1 和 e2 之间的关系指定类型,因此图中的任何关系都会匹配。模式中可以有两到三个关系,这将转换为实体节点之间的一两个 Post 节点。

我假设关系的方向无关紧要,所以我在关系箭头上留下了方向。我要求 e1 的节点 ID 小于 e2 的节点 ID,以避免在两个方向上创建 RELATED_TO 关系。

如果您需要在您描述的架构中查找超过 3 个关系的路径,您可以考虑使用apoc 路径扩展器来搜索仅包含 Post 节点的实体到实体路径。

于 2021-11-24T18:37:03.130 回答