使用 Cypher 查询读取

此页面中的所有示例都假设 SparkSession 已使用适当的身份验证选项进行初始化。有关更多详细信息,请参阅快速入门示例

如果您需要更大的灵活性,可以使用 query 选项运行自定义 Cypher® 查询。

查询必须包含 RETURN 子句。对于存储过程,您需要在 RETURN 之前包含 YIELD 子句。

query 选项示例
val query = """
  MATCH (n:Person)
  WITH n
  LIMIT 2
  RETURN id(n) AS id, n.name AS name
"""

spark.read.format("org.neo4j.spark.DataSource")
  .option("query", query)
  .load()
  .show()
表 1. 结果
id name

0

John Doe

1

Jane Doe

DataFrame 列

结果 DataFrame 的结构由查询本身定义。有关更多详细信息,请参阅模式推断页面。

当您返回单个属性而不是图实体(节点、关系、路径)时,此选项最适用。然而,返回图实体并不会导致错误。

推荐 不推荐
MATCH (p:Person)
RETURN id(p) AS id, p.name AS name
MATCH (p:Person)
RETURN p

如果您需要返回图实体,请改用 labelsrelationship 读取选项。

限制结果

连接器内部使用 SKIPLIMIT 来支持分区读取;因此,自定义 Cypher 查询中不允许包含 SKIPLIMIT 子句。尝试这样做将导致执行错误。

一种可能的解决方法是在 RETURN 子句之前使用 SKIPLIMIT。例如,以下查询会失败

MATCH (p:Person)
RETURN p.name AS name
ORDER BY name
LIMIT 10

可以在 RETURN 之前使用 LIMIT 重写查询以成功完成

MATCH (p:Person)
WITH p.name AS name
ORDER BY name
LIMIT 10
RETURN p.name

重写查询时,请确保新查询与原始查询等效,以保证结果相同。

您也可以使用 query.count 选项,而无需重写查询。有关更多详细信息,请参阅Spark 优化页面。

script 选项

script 选项允许在执行读取操作之前运行一系列 Cypher 查询。

script 的结果可以在后续的 query 中使用,例如注入查询参数。

scriptquery 示例
val script = "RETURN 'foo' AS val"
val query = """
  UNWIND range(1, 2) as id
  RETURN id AS val, scriptResult[0].val AS script
"""

spark.read.format("org.neo4j.spark.DataSource")
  .option("script", script)
  .option("query", query)
  .load()
  .show()
表 2. 结果
val script

1

foo

2

foo

© . All rights reserved.