【问题标题】:Return an edgelist from second degree query从二级查询返回边缘列表
【发布时间】:2019-08-20 14:30:26
【问题描述】:

我正在尝试在不使用两个匹配子句的情况下从二级查询中导出边缘列表。

我已经编写了一个查询来创建我需要的输出,但它需要两次搜索图表并从 csv 中读取我的匹配条件两次。

这是我当前的工作查询:

CALL apoc.export.csv.query('LOAD CSV WITH HEADERS FROM \'file:///degree0.csv\' as pg_pap
MATCH (n:paper{paper_id:pg_pap.`paper_id`})<-[:REFERENCES]-(m:paper)
RETURN n.paper_id AS From , m.paper_id AS To
UNION ALL
LOAD CSV WITH HEADERS FROM \'file:///degree0.csv\' as pg_pap
MATCH (n:paper{paper_id:pg_pap.`paper_id`})<-[:REFERENCES]-(m:paper)<-[:REFERENCES]-(o:paper)
RETURN m.paper_id AS From, o.paper_id AS To
', 'edge.csv', {})
;

这是我想要的行为,但显然有两个 MATCH 子句和两个 LOAD CSV 语句,性能不是很好。我试着用这样的路径匹配写一些东西:

CALL apoc.export.csv.query('LOAD CSV WITH HEADERS FROM \'file:///degree0.csv\' as pg_pap
MATCH p=(n:paper{paper_id:pg_pap.`paper_id`})<-[:REFERENCES]-(m:paper)<-[:REFERENCES]-(o:paper)
UNWIND (nodes(p)) as nodes
RETURN nodes.paper_id', 'edge.csv', {})
;

但这只是返回一列 ID 而不会生成边缘列表。

有没有一种方法可以使用单个 LOAD CSV 和单个 MATCH 子句编写查询,并且仍然返回网络的统一边缘列表?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这可能对你有用:

    MATCH (n:paper{paper_id:pg_pap.`paper_id`})<-[:REFERENCES]-(m:paper)
    WITH
      COLLECT({from: n, to: m}) AS data1,
      [(m)<-[:REFERENCES]-(o:paper) | {from: m, to: o}] AS data2
    UNWIND (data1 + data2) AS data
    RETURN DISTINCT data;
    

    查询收集data1 中的所有m/n 对,以及data2 中存在的所有m/o 对。然后它展开data1data2 的组合,以返回DISTINCT 成对的论文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2011-09-30
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      相关资源
      最近更新 更多