Neo4j:具有多重关系的二分到单分投影
Neo4j: Bipartite to monopartite projection with multiple relationships
我是 Neo4j 的新手。我正在尝试从二分图创建单分投影。我只有两种类型的节点:
- Post节点(绿色):这些都是内容,比如tweet,redditpost,新闻文章等等
- 实体节点(棕色):这些是与内容关联的实体
我的挑战是我有一些不同的关系。一些例子:
- (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)
我想做的是
- 将其更改为只有
实体,但根据所有类型推断 RELATED_TO 边
关系,不只是一种关系and
- 根据两个实体同时出现的次数分配边权重。
换句话说,使用上面的例子:
示例 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:实体)
我可以在网上找到仅将一种类型的关系转换为单方关系的示例,但似乎无法为多重关系或具有不同类型的中间节点(即两个 post实体节点之间的节点)。我已经完成了图形数据科学培训,但也找不到我想要的东西。
有什么建议吗?
这个查询对你有用吗?
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 path expander 来搜索只有 Post 个节点的实体到实体路径.
我是 Neo4j 的新手。我正在尝试从二分图创建单分投影。我只有两种类型的节点:
- Post节点(绿色):这些都是内容,比如tweet,redditpost,新闻文章等等
- 实体节点(棕色):这些是与内容关联的实体
我的挑战是我有一些不同的关系。一些例子:
- (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)
我想做的是
- 将其更改为只有 实体,但根据所有类型推断 RELATED_TO 边 关系,不只是一种关系and
- 根据两个实体同时出现的次数分配边权重。
换句话说,使用上面的例子:
示例 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:实体)
我可以在网上找到仅将一种类型的关系转换为单方关系的示例,但似乎无法为多重关系或具有不同类型的中间节点(即两个 post实体节点之间的节点)。我已经完成了图形数据科学培训,但也找不到我想要的东西。
有什么建议吗?
这个查询对你有用吗?
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 path expander 来搜索只有 Post 个节点的实体到实体路径.