通过 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 子句。尝试这样做会导致执行错误。

一种可能的变通方法是将 SKIPLIMIT 放在 RETURN 子句之前。例如,以下查询会失败

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 脚本

1

foo

2

foo