

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 CSV 查询示例
<a name="access-graph-opencypher-21-extensions-s3-read-csv"></a>

在此示例中，查询返回给定 CSV 文件中的行数：

```
CALL neptune.read(
  {
    source: "<s3 path>",
    format: "csv"
  }
)
YIELD row
RETURN count(row)
```

您可以通过执行以下代码，使用中的 execute-open-cypher-query 操作来运行查询示例： AWS CLI 

```
aws neptunedata execute-open-cypher-query \
--open-cypher-query "CALL neptune.read({source: '<s3 path>', format: 'csv'}) YIELD row RETURN count(row)" \
--endpoint-url https://my-cluster-name.cluster-abcdefgh1234.us-east-1.neptune.amazonaws.com:8182
```

查询可以灵活地处理从 CSV 文件中读取的行。例如，以下查询创建了一个节点，其字段设置为 CSV 文件中的数据：

```
CALL neptune.read(
  {
    source: "<s3 path>",
    format: "csv"
  }
)
YIELD row
CREATE (n {someField: row.someCol}) 
RETURN n
```

**警告**  
在 CALL 子句之前使用像 MATCH (n) 这样的大型结果生成子句不被视为良好做法。由于来自先前子句的传入解决方案与 neptune.read 读取的行之间存在交叉积，这将导致查询长时间运行。建议使用 CALL neptune.read 开始查询。

## 属性列标题
<a name="property-column-headers"></a>

可通过使用以下语法指定属性的列 (`:`)。类型名称不区分大小写。如果属性名称中出现冒号，则必须在其前面加上反斜杠:。`\:`

```
propertyname:type
```

**注意**  
不允许在列标题中使用空格、逗号、回车和换行符，因此属性名称不得包含这些字符。
您可以通过将 `[]` 添加到类型来指定数组列：  

  ```
                          propertyname:type[]
  ```
边缘属性只能有一个值，如果指定了数组类型或指定了另一个值，则会导致错误。以下示例显示了名为 age 且类型为 Int 的属性的列标题：  

  ```
  age:Int
  ```

文件中的每行都需要在该位置具有整数或保留为空。允许使用字符串数组，但是数组中的字符串不能包含分号 (`;`) 字符，除非使用反斜杠 () 对其进行转义。`\;`

## 支持的 CSV 列类型
<a name="supported-csv-column-types"></a>
+ **BOOL（或布尔值）**-允许的值：真、假。指示 Boolean 字段。除 true 之外的任何值都将被视为假。
+ **FLOAT**-范围：32 位 IEEE 754 浮点数，包括 Infinity、INF、-Infinity、-INF 和 NaN（不是数字）。
+ **双精**度-范围：64 位 IEEE 754 浮点数，包括 Infinity、INF、-Infinity、-INF 和 NaN（不是数字）。
+ **字符串**- 
  + 引号是可选的。如果逗号、换行符和回车符包含在由双引号 (“) 包围的字符串中，则会自动对其进行转义。示例：“你好，世界”。
  + 要在带引号的字符串中包含引号，可以连续使用两个引号来转义引号：示例：“Hello “" World ""””。
  + 允许使用字符串数组，但是数组中的字符串不能包含分号 (;) 字符，除非使用反斜杠 (\\;) 对其进行转义。
  + 如果要使用引号将数组内的字符串括起来，则必须使用一组引号将整个数组括起来。示例：“字符串一；字符串 2；字符串 3”。
+ **日期、日期时间**-日期时间值可以采用 XSD 格式或以下格式之一提供：
  + yyyy-MM-dd
  + yyyy-MM-ddTHH:mm
  + yyyy-MM-ddTHH:mm:ss
  + yyyy-MM-ddTHH:mm:ssZ
  + yyyy-MM-ddTHH:mm:ss.SSSZ
  + yyyy-MM-ddTHH:mm:ss [\+\|-] 嗯嗯
  + yyyy-MM-ddTHH:mm:ss.SSS [\+\|-] 嗯嗯
+ 有@@ **符号整数**- 
  + 字节：-128 到 127
  + 空头：-32768 至 32767
  + Int：-2^31 到 2^31-1
  + 长：-2^63 到 2^63-1

**Neptune-specific 列类型：**
+ 用户列中支持 “任意” 列类型。Any 类型是我们支持的所有其他类型的 “句法糖” 类型。如果用户列中有多种类型，则它非常有用。Any type 值的有效负载是一个 json 字符串列表，如下所示：`{"value": "10", "type": "Int"};{"value": "1.0", "type": "Float"}`，它在每个 json 字符串中都有一个值字段和一个类型字段。“任意” 类型的列标题是属性名称：any。已设置 “任意” 列的基数值，这意味着该列可以接受多个值。
  + Neptune 在 Any 类型中支持以下类型：布尔型（或布尔型）、字节、短整型、长整型、、、、、 UnsignedByte UnsignedShort、浮点型 UnsignedInt UnsignedLong、双精度、日期、日期时间、日期时间、字符串和几何。
  + 任何类型都不支持向量类型。
  + 嵌套不支持任何类型。例如 `{"value": {"value": "10", "type": "Int"}, "type": "Any"}`。
+ 用户列支持几何列类型。这些列的有效载荷只能包含 Point 类型的几何基元，以 Well-known 文本 (WKT) 格式的字符串形式提供。例如，POINT (30 10) 将是有效的几何值。

## CSV 输出示例
<a name="sample-csv-output"></a>

给出以下 CSV 文件：

```
<s3 path>
colA:byte,colB:short,colC:int,colD:long,colE:float,colF:double,colG:string
-128,-32768,-2147483648,-9223372036854775808,1.23456,1.23457,first
127,32767,2147483647,9223372036854775807,nan,nan,second
0,0,0,0,-inf,-inf,third
0,0,0,0,inf,inf,fourth
```

此示例显示了 neptune.read 使用以下查询返回的输出：

```
aws neptunedata execute-open-cypher-query \
--open-cypher-query "CALL neptune.read({source: '<s3 path>', format: 'csv'}) YIELD row RETURN row" \
--endpoint-url https://my-cluster-name.cluster-abcdefgh1234.us-east-1.neptune.amazonaws.com:8182
```

```
{
  "results": [{
      "row": {
        "colD": -9223372036854775808,
        "colC": -2147483648,
        "colE": 1.23456,
        "colB": -32768,
        "colF": 1.2345699999999999,
        "colG": "first",
        "colA": -128
      }
    }, {
      "row": {
        "colD": 9223372036854775807,
        "colC": 2147483647,
        "colE": "NaN",
        "colB": 32767,
        "colF": "NaN",
        "colG": "second",
        "colA": 127
      }
    }, {
      "row": {
        "colD": 0,
        "colC": 0,
        "colE": "-INF",
        "colB": 0,
        "colF": "-INF",
        "colG": "third",
        "colA": 0
      }
    }, {
      "row": {
        "colD": 0,
        "colC": 0,
        "colE": "INF",
        "colB": 0,
        "colF": "INF",
        "colG": "fourth",
        "colA": 0
      }
    }]
}
```

目前，无法为来自 CSV 文件的数据字段设置节点或边缘标签。建议您将查询分成多个查询，每个查询对应一个 label/type。

```
CALL neptune.read({source: '<s3 path>', format: 'csv'})
 YIELD row 
WHERE row.`~label` = 'airport'
CREATE (n:airport)

CALL neptune.read({source: '<s3 path>', format: 'csv'})
YIELD row 
WHERE row.`~label` = 'country'
CREATE (n:country)
```