模式推断
由于 Neo4j 本质上是无模式的,而 Spark DataFrame 使用固定的表格模式,Spark 连接器采用模式推断系统将图数据转换为 DataFrame。
-
如果已安装 APOC,连接器会使用
apoc.meta.nodeTypeProperties和apoc.meta.relTypeProperties过程。你可以微调两者。 -
如果未安装 APOC,连接器会使用额外 Cypher® 查询的前 n 条结果(由
schema.flatten.limit选项定义)来根据每列的类型推断模式。当使用query选项时,模式是从查询本身的结果中推断的。
两种方法都使用抽样,这是 schema.strategy 选项的默认值(sample)。确切使用的 APOC 过程或 Cypher 查询取决于读取选项。
此策略在 Neo4j 中所有属性实例具有相同类型时有效。否则,连接器仍会尝试推断模式,但会记录类似以下的消息:
The field "age" has different types: [String, Long]
Every value will be casted to string.
在这种情况下,你应该定义模式。
labels 选项
如果已安装 APOC,连接器会使用 apoc.meta.nodeTypeProperties 过程。否则,它会执行以下 Cypher 查询:
MATCH (n:<labels>) (1)
RETURN n
ORDER BY rand()
LIMIT <limit> (2)
| 1 | <labels> 是由 labels 选项提供的标签列表。 |
| 2 | <limit> 是由 schema.flatten.limit 选项提供的数值。 |
随后从查询结果中推断出模式。
relationships 选项
如果已安装 APOC,连接器会使用 apoc.meta.relTypeProperties 过程。否则,它会执行以下 Cypher 查询:
MATCH (source:<source_labels>)-[rel:<relationship>]->(target:<target_labels>) (1) (2) (3)
RETURN rel
ORDER BY rand()
LIMIT <limit> (4)
| 1 | <source_labels> 是由 relationship.source.labels 选项提供的标签列表。 |
| 2 | <target_labels> 是由 relationship.target.labels 选项提供的标签列表。 |
| 3 | <relationship> 是由 relationship 选项提供的关系类型列表。 |
| 4 | <limit> 是通过 schema.flatten.limit 提供的数值。 |
随后从查询结果中推断出模式。
query 选项
使用 query 选项时,连接器会使用查询结果的前 n 条记录(由 schema.flatten.limit 选项定义)来推断模式。
例如,如果读取查询为 MATCH (n:Person) WITH n LIMIT 2 RETURN id(n) as id, n.name as name,连接器会先运行以下查询:
MATCH (n:Person) WITH n LIMIT 2 RETURN id(n) as id, n.age as age (1)
ORDER BY rand()
LIMIT <limit> (2)
| 1 | 原始读取查询。 |
| 2 | <limit> 是通过 schema.flatten.limit 提供的数值。 |
随后从查询结果中推断出模式。
如果查询未返回任何数据,则无法进行抽样。在这种情况下,连接器会根据 RETURN 语句创建模式,所有列的类型均为 String。由于结果集为空,这不会导致任何问题。