Neo4j:具有多种关系的二部到单部投影

Posted

技术标签:

【中文标题】Neo4j:具有多种关系的二部到单部投影【英文标题】:Neo4j: Bipartite to monopartite projection with multiple relationships 【发布时间】:2022-01-03 00:45:31 【问题描述】:

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

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

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

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

我想做的是

    将此更改为仅具有 实体,但根据所有类型的 关系,而不仅仅是单一类型的关系和 根据两个实体同时出现的次数分配边权重。

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

示例 1

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

示例 2

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

示例 3

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

我可以在网上找到示例,这些示例仅将一种类型的关系转换为单方关系,但对于具有不同类型的中间节点(即实体之间的两个 post 节点)的多个关系或关系似乎没有任何作用节点)。我已经完成了图形数据科学培训,但也找不到我想要的确切内容。

有什么建议吗?

【问题讨论】:

【参考方案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 path expander 来搜索仅包含 Post 节点的实体到实体路径。

【讨论】:

由于某种原因它不是。我这样做是因为我想要一个可以再次调用的投影... CALL gds.graph.create('entities', 'Entity', MATCH (e1:Entity)--[2.. 3]--(e2:Entity) WHERE id(e1) ) 作为强度 MERGE (e1)-[r:RELATED_TO]->(e2) SET r .strength = strength) 但是通配符不起作用。我收到此错误... Invalid input '*': expected whitespace, a variable,RelationshipsPattern, an expression or ']' (line 1, column 65 (offset: 64)) "CALL gds.graph.create('entities' , '实体', MATCH (e1:Entity)--[*2..3]--(e2:Entity)" 我应该补充一点,查询在单独使用时有效。但它似乎是在图表本身上执行操作而不是创建投影(虽然作为 Neo4j 的新手,也许我弄错了)。 没关系,我明白了。我遇到了一些内存问题,即使使用 apoc.periodic.iterate 也无法正常工作。我最后只是把它分成几批:1)像你建议的那样创建一种新的关系类型,然后在一个单独的查询中计算所有这些关系。我相信有更清洁的方法可以做到这一点。但是由于我的存储空间超过了我的 RAM,而且我对迭代并不精通,所以这完成了工作。你的小费给了我一个巨大的起点!谢谢! 我很高兴它有帮助。听起来你正在做一些有趣的工作。如果您想远程加入我们的堪萨斯城图形数据库聚会,欢迎您。 meetup.com/Kansas-City-Graph-Databases-Meetup-Group/events/…

以上是关于Neo4j:具有多种关系的二部到单部投影的主要内容,如果未能解决你的问题,请参考以下文章

在Neo4J中创建具有相同属性的节点之间的关系

Neo4j 密码查询以获取与特定其他节点没有关系的所有节点

neo4j,密码关系存在,关系属性存在于where,order by和limit

Neo4j - 关系内的数组内的数组

如何在我的 Graphql Schema 中表示 Neo4j 关系属性?

neo4j简介