【问题标题】:Neo4j: Create paths/subgraph from APOC virtual relationships for streaming to GephiNeo4j:从 APOC 虚拟关系创建路径/子图以流式传输到 Gephi
【发布时间】:2018-08-15 04:14:41
【问题描述】:

我有一个 Neo4j 数据库,包括由 ACTED_IN 关系连接的 Film 和 Person 节点。使用 APOC,我成功地在 Person 节点之间直接创建了一组虚拟 ACTED_WITH 关系,反映了它们通过它们都出现的 Film 间接相关的事实:

MATCH (a:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(b:Person)
WITH a, b
CALL apoc.create.vRelationship(a, 'ACTED_WITH', {}, b) YIELD rel
RETURN a, rel, b

这似乎捕捉到了我正在寻找的间接关系。现在我想将结果流式传输到 Gephi 以进行可视化。但相关的 APOC 函数采用 paths 参数。所以这行得通:

MATCH path = ()-[:ACTED_IN]->()
WITH collect(path) AS paths
CALL apoc.gephi.add(null, 'workspace0', paths) YIELD nodes, relationships, time
RETURN nodes, relationships, time

如何从第一个代码块中产生的虚拟关系创建一组路径,以便像第二个代码块一样传递给 Gephi? (或者有没有更好的方法来处理这种情况?)

【问题讨论】:

    标签: neo4j gephi neo4j-apoc


    【解决方案1】:

    apoc.gephi.add 过程的数据可以是 instanceof:Node、Relationship、Path、Iterable、Map、Iterator、Object。

    所以它应该像这样工作:

    MATCH (a:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(b:Person) WHERE ID(a) > ID(b) 
    WITH DISTINCT a, b
    CALL apoc.create.vRelationship(a, 'ACTED_WITH', {}, b) YIELD rel AS rel1
    CALL apoc.create.vRelationship(b, 'ACTED_WITH', {}, a) YIELD rel AS rel2
    WITH collect(rel1) + collect(rel2) + collect(a) + collect(b) AS data
    CALL apoc.gephi.add(null, 'workspace0', data) YIELD nodes, relationships, time
    RETURN nodes, relationships, time
    

    更新:如果你需要权重,那么你可以简单地按电影聚合:

    MATCH (a:Person)-[:ACTED_IN]->(M:Movie)<-[:ACTED_IN]-(b:Person) WHERE ID(a) > ID(b) 
    WITH a, b, 
         count(M) as vWeight
    CALL apoc.create.vRelationship(a, 'ACTED_WITH', {weight: vWeight}, b) YIELD rel AS rel1
    CALL apoc.create.vRelationship(b, 'ACTED_WITH', {weight: vWeight}, a) YIELD rel AS rel2
    WITH collect(rel1) + collect(rel2) + collect(a) + collect(b) AS data
    CALL apoc.gephi.add(null, 'workspace0', data) YIELD nodes, relationships, time
    RETURN nodes, relationships, time
    

    【讨论】:

    • 这太好了,谢谢。对我最初的问题的一种扩展,但是有没有一种好方法可以将节点之间的并行关系折叠在一起? (我的意思是当两个演员一起出现在一部电影中时,节点之间会产生重复的连接。)
    • @rjww 取决于你的目标。在我看来,从普通电影的数量来看,一定与房产有一种关系。
    • 是的,理想情况下,在共同出现的演员之间会有一个单一的虚拟关系(或互惠对,我猜,考虑到 Neo4j 图是有向的),其权重属性是他们一起出现的电影。最终目标是将类似的东西放入 Gephi,以便我可以创建一些具有不同中心性度量的探索性可视化等。
    • @rjww 对于权重,使用聚合函数count。查看答案的补充。
    • 合并两个节点之间的重复虚拟关系有什么可能的解决方案?
    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2018-06-03
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多