【问题标题】:Iterate over csv file and query on property values - Cypher Neo4j遍历 csv 文件并查询属性值 - Cypher Neo4j
【发布时间】:2019-01-21 21:13:59
【问题描述】:

请查看 csv 文件的图片。我正在使用 Cypher,Neo4j。如您所见,带有时间戳的活动都分别属于一个 case_id。许多属于同一个case_id(这里你看到case_id 3、2、1),但请想象还有更多。我想对属于同一案例 ID 的活动进行分组并执行相同的操作!查询每个组(分组是必不可少的)。

除了为每个组重写相同的查询之外,还有其他方法吗,就像这里分三步完成的那样?:

1.

USING PERIODIC COMMIT 1000

LOAD CSV WITH HEADERS FROM "file:///XY" AS row

WITH toInteger(row.case_id) AS cid, row

WHERE cid=3

CREATE (act:Activity {caseId: cid, activityName: row.activity, time: row.timestamp})

'QUERY'

2.

LOAD CSV WITH HEADERS FROM "file:///XY" AS row

WITH toInteger(row.case_id) AS cid, row

WHERE cid=2

CREATE (act:Activity {caseId: cid, activityName: row.activity, time: row.timestamp})

'QUERY'

3.

LOAD CSV WITH HEADERS FROM "file:///XY" AS row

WITH toInteger(row.case_id) AS cid, row

WHERE cid=1

CREATE (act:Activity {caseId: cid, activityName: row.activity, time: 
row.timestamp})

'QUERY'

所以基本上我想概括WHERE cid=3(or 2 or 1),在没有明确命名的情况下迭代所有不同的case-id。有点像Java中的for each element in array (array content: group by case_id) do QUERY

知道怎么做吗?

提前谢谢你,如果这听起来太神秘,我很乐意提供更好的描述。

更新: 这是查询:

MATCH(act: Activity)
WHERE act.caseId = 1 //and here I want to be able to simplify for EVERY caseId
WITH act ORDER BY act.time ASC 
WITH apoc.coll.frequencies(apoc.coll.pairsMin(COLLECT(act.activityName))) AS g
UNWIND g AS p
RETURN*

【问题讨论】:

    标签: loops csv filter neo4j cypher


    【解决方案1】:

    在我看来,一个 LOAD CSV 查询应该可以处理这个问题,只需将 caseId 设置为 row.case_id 的整数值:

    USING PERIODIC COMMIT 1000
    LOAD CSV WITH HEADERS FROM "file:///XY" AS row
    WITH toInteger(row.case_id) AS cid, row
    CREATE (act:Activity {caseId: cid, activityName: row.activity, time: row.timestamp})
    

    好的,我看到您想对每个组执行一些查询。您能解释一下为什么在加载 csv 中创建后执行查询不起作用吗?

    导入后执行查询对您有用吗?

    有关您打算运行的查询的更多信息会有所帮助。

    【讨论】:

    • "你能解释一下为什么在 load csv 中创建后执行查询不起作用吗?" -> 它可以工作,但请想象有多达一百个不同的 case_id。 “执行导入后查询对您有用吗?”最好在进口时。但如果不可能,是的。
    • "有关您打算运行的查询的更多信息会有所帮助。" -> 在每个组中,我想通过第一个时间戳排序节点,然后通过成对的活动。
    • 您有机会提供查询吗? time 属性意味着您只需要按该属性进行查询和排序,除非您想通过这些节点按顺序创建链表结构。您能否详细说明“活动对”的含义?
    • 到目前为止感谢 InverseFalcon。实际上,我真正想做的就是执行查询,而不必引用每个不同的 cid。我已经尝试过您建议的查询。它导入所有节点,仅此而已。但我想要一个一般性声明'对于每个不同的 cid 执行 QUERY X'。我在手册等中找不到任何东西。目前我无法更好地解释它。也许有人知道我的意思?
    • 在这种情况下,是否值得用 caseId 合并一个 :Case 节点,然后创建它与 :Activity 节点之间的关系?再加上对 :Case(caseId) 的唯一约束,将确保您对每个案例都有一个不同的节点,然后您的后续查询可以在所有 :Case 节点上 MATCH 并执行您想要的查询(可能与每个案例关联的 :Activity 节点匹配)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多