关于多个企业之间关联关系、路径查询,求助!
发布于 5 天前 作者 isduanhao 96 次浏览 来自 问答

刚学习neo4j不久。准备使用neo4j查询多个企业之间的关系,但是遇到了很多问题,希望各位前辈能帮忙解答。

1.数据、资源配置如下 Neo4j 4.0.4 社区版,硬件配置:16核心,64G内存。 image.png NodeA Company 企业节点 6000W+ 属性:entid 企业唯一标识 NodeB Person 相关企业人物 1亿+ 属性:personid 人物唯一标识 关系约 1.5亿 relA inv 投资关系 属性:conprop 投资比例 relB pos 任职关系 属性:position 职位 2.想要达到的目标 入参:多个企业或人物,路径长度 image.png 返回路径:最短路径 以及 优质路径 image.png 3.我实现的过程 先说明一下我所谓的优质路径吧。。 之前的优质路径 使用了 dijkstra 算法 加了权重,计算出来的。由于我对这块了解的太少了,并且 现在也没有相关的权重值,所以我放弃了使用这个。 我降低了 对自己的要求,希望能够优先 展示出较短路径 作为优质路径,因为返回给前端的路径 会加 limit 限制,且需要较短的时间内返回。 先贴一下我的查询语句;

	match (c:Company),  (p:Person)
where c.entid in [11111,22222,33333] and p in [444444]
with collect(id(c)) + collect(id(p)) as ids 	
match path= (start_node) - [*..6]-(end_node)
where id(start_node) in ids
and id(end_node) in ids
and id(start_node) <> id(end_node)
and apoc.coll.duplicates(NODES(path)) = []
return path order by length(path) limit 20

上面这个语句查出来的结果是我想要的,也是我想表达的。 但是查询速度巨慢,我好像发现他是 查询完所有的路径后 才进行的排序。 在我不加 order by 的时候,默认排序 是优先最大深度的路径。但这样并不是我想要的结果,而且速度也并不怎么理想。 但是 用这个语句来查询最短路径还是比较理想的。 4.我的疑惑
我不太清楚 我现在学习 neo4j 的路径应该怎么规划,因为我是一名python的后端开发,目前我只是做功能。因为了解的太少了,甚至连相关的名词都不太清楚,百度也不知道该怎么搜索。。昨天看到了 @pangguoming 前辈的几篇文章,里面的这个仿佛就是我要找的东西,但是却不知道该怎么应用到我的查询里面。。 image.png a.硬件资源配置和现在的数据量大小,是否匹配? b.有没有现成的函数,可以完成我的查询,路径深度 从浅到深的排序? c.关于我个人学习neo4j的路径规划,希望可以得到指点! d.是否可以使用 neo4j,通过企业之间的关联关系,把出现的人物进行关联,把相同姓名的人物判定为同一人,增加人物的唯一标识(personid)? 希望前辈们,能帮忙指点, 感谢!

7 回复

shortestpath 和 allshortpath 两个方法是你需要的:

match p = shortestpath((:hero{name:“孙尚香”})-[*…5]-(:hero{name:“武则天”})) return p

match p = allshortpath((:hero{name:“孙尚香”})-[*…5]-(:hero{name:“武则天”})) return p

@pangguoming 这个只是最短路径吧。 我想要的是 从 最短路径 到 长路径的排序,直到取到 limit 限制为止。 比如,深度为5 我取出 深度 1->2->3 limit 30,这样子。。

嗯,作为Python开发人员,你要学的可就不少了。以下是几个建议: 1、了解Neo4j图数据库的基础,例如属性图的含义和内容、数据库特性如索引的定义等;可以看看论坛中:Neo4j Cypher 图数据库查询语言快速参考 系列文章。 2、你要解决的是个路径搜索问题,或者说图遍历问题。Cypher可以实现,但是性能不是最佳,建议参考APOC存储过程,这里有介绍:http://neo4j.com.cn/topic/5aeb9c8c51bad0a10b198ce6 。 3、硬件配置还行,就是要设置内存:neo4j.conf中看看heap_memory(最大配4g)和page_cache(配32g)大小; 4、关于问题d,是一个相似度判定问题,需要另外讨论。

@graphway 好的。非常感谢您的建议。服务器配置已经调整过了,现在看来应该多看看相关文档和APOC 了。

@graphway 这是我根据 expand 写的 查询语句,可以查到我想要的结果,但是速度还是不太理想,应该是遍历了太多的路径。 MATCH (c:Company) where c.entid in [1111,2222] with collect(id©) as ids CALL apoc.path.expand(ids, ‘’,’’,0, 10 ) YIELD path with NODES(path) as nodes, path where apoc.coll.duplicates(nodes) = [] and id(nodes[size(nodes)-1]) in ids return path limit 20 我想在 labelFilter 添加 过滤,apoc.path.expand(ids, ‘’,’+ids’,0, 10 ) 但是过滤完后只剩下这两个节点了,没想到什么原因导致。。。

你的label应该是Company啊,为什么写’+ids’?

另外还可以看看expandConfig(),里面的配置更加丰富,特别是uniqueness唯一性参数。

@graphway 嗯,我在看看,+ids我想找路径中包含 起始节点的(入参节点),image.png这是我想要的结果。我想要 filterLable 为 +ids 来实现 现在 id(nodes[size(nodes)-1]) in ids所实现的过滤。 不过滤会出现这样的路径 image.png, 我想在 expand 的过程中就加入路径起始节点的限制,然后limit,理论上这样会更快些把。。image.png 但是现在没有好的办法 让他们在 expand 的过程中就 把路径连接起来。。

回到顶部