我是Neo4j的新手,为了充分加载csv文件,我正在努力工作以获得Cypher的工作要求。
csv文件有6个字段:
code_a| a| code_b| b|code_c|c|
101,a101,101,NameForB1,101_0,NameForC1
101,a101,101,NameForB1,101_1,NameForC2
101,a101,101,NameForB1,101_2,NameForC3
101,a101,101,NameForB1,101_3,NameForC4
........................................
102,a102,102,NameForB2,102_0,NameForC1
102,a102,102,NameForB2,102_1,NameForC2
102,a102,102,NameForB2,102_2,NameForC3
102,a102,102,NameForB2,102_3,NameForC4
说明:
前两个字段(code_a,a)用于ROOTCATEGORY
后面的两个字段(code_b,b)用于CATEGORY
和最后两个字段,该对(code_c,c)用于SUBCATEGORY
要加载csv文件,我创建了以下3个约束条件:
CREATE CONSTRAINT ON (r:ROOTCATEGORY) ASSERT r.fieldA IS UNIQUE;
CREATE CONSTRAINT ON (c:CATEGORY) ASSERT c.fieldB IS UNIQUE;
CREATE CONSTRAINT ON (s:SUBCATEGORY) ASSERT s.fieldC IS UNIQUE;
LOAD CSV WITH HEADERS FROM "file:///the-file-name.csv" as
line FIELDTERMINATOR ','
MERGE (r:ROOTCATEGORY{fieldA: line.a})
ON CREATE SET r.description=line.a
ON CREATE SET r.identifier=line.code_a
ON CREATE SET r.id = toString(id(r))
MERGE (c:CATEGORY{fieldB:line.b})
ON CREATE SET c.identifier=line.code_b
ON CREATE SET c.a=line.a
ON CREATE SET c.Identifier=line.code_a
ON CREATE SET c.description=line.b
ON CREATE SET c.id = toString(id(c))
WITH c,r,line
MATCH (c {identifier:line.code_b}),(r {identifier:line.code_a})
CREATE UNIQUE (c)-[:IS_A_Category_BELONGING_TO]->(r)
MERGE (s:SUBCATEGORY {fieldC:line.c})
ON CREATE SET s.identifier=line.code_c
ON CREATE SET s.fieldA=line.a
ON CREATE SET s.ROOTCATEGORYIdentifier=line.code_a
ON CREATE SET s.fieldB=line.b
ON CREATE SET s.CATEGORYIdentifier=line.code_b
ON CREATE SET s.description=line.c
ON CREATE SET s.id = toString(id(s))
WITH s,c,r,line
MATCH (s {identifier:line.code_c}),(r{identifier:line.code_a})
CREATE UNIQUE (s)-[:IS_A_SUBCATEGORY_BELONGING_TO_THAT_ROOTCATEGORY]->(r)
WITH s,c,r,line
MATCH (s {identifier:line.code_c}),(c{identifier:line.code_b})
CREATE UNIQUE (s)-[:IS_A_SUBCATEGORY_BELONGING_TO_THAT_CATEGORY]->(c)
通过加载所有字段并创建所有关系和属性,Cypher工作得很好。
但我现在想要做的是:手动插入(添加)在csv文件行(特殊代码和特殊字符串),如下所述:3374991002 - specialCode是:337499(常量)+ Code_a(我,e代码对于ROOTCATEGORY)(100)+ theRowNumberOfThatEntry(2)
specialString是:BLANKEMPTY + Code_a(i,e代码ROOTCATEGORY)+ theRowNumberOfThatEntry
例如,我想在第一步(迭代)中插入波纹管:
100,BLANKEMPTY1001662,3374991001662,BLANKEMPTY1001662,3374991001662,BLANKEMPTY1001662_BLANKEMPTY1001662
然后是第二步(迭代)具有相同code_a的另一行(RootCategory代码100)
100,BLANKEMPTY1002,3374991002,BLANKEMPTY1002,3374991002,BLANKEMPTY1002_BLANKEMPTY1002
因此,对于具有specialStrings和specialCodes的行(要附加到csv文件中),我们可以继续将它们手动添加到csv文件,尽可能多的我们希望具有相同code_a(等于100)的行(节点)例如在我们的例子中)。因此我们产生了一个新的csv,我将在此后扩展csv文件。
将我以前的工作密码请求应用于该扩展csv文件中我得到:
实际上,这是不好的结果。而不是每个都有两个节点,其目标是仅在DB上为一个节点生成rootCategory,一个节点用于类别,一个节点用于子类别。
调整以前的工作Cypher查询,:
1 - 这样除了在csv文件上加载没有任何特殊代码或特殊字符串的行,如上面解释的ROOTCATEGORY,CATEGORY,SUBCATEGORY,+
2-
它还必须处理插入具有特殊字符串和扩展csv文件的特殊代码的行的情况。
即如果我已经加载到数据库,ROOTCATEGORY节点与特殊代码和具有相同code_a的特殊字符串
和/或具有相同code_a的特殊代码和特殊字符的CATEGORY NODE
和/或用于具有相同code_a的特殊代码和特殊字符的SUBCATEGORY NODE
然后我想用相同的code_a插入另一行,并有特殊的代码和specialStrings。不要结束两个结果节点。而只是为了更新最后一个现有节点(如果DB上已经存在最后一个可用数据),以便最终只有一个节点具有更新的信息。当然,如果数据库不存在,我们应该创建节点并设置必要的属性。
为此,我尝试了以下请求,但我仍然每次都创建两个节点。
LOAD CSV WITH HEADERS FROM "file:///the-file-name.csv" as
line FIELDTERMINATOR ','
OPTIONAL MATCH (r:ROOTCATEGORY) where r.fieldA contains "BLANKEMPTY" AND
r.identifier= line.code_a
WITH (CASE WHEN r IS NULL THEN [1] ELSE [] END ) AS todoROOTCATEGORY,line
FOREACH (x IN todoROOTCATEGORY |
MERGE (n:ROOTCATEGORY{fieldA: line.a})
ON CREATE SET n.description=line.a
ON CREATE SET n.identifier=line.code_a
ON CREATE SET n.id = toString(id(n))
ON MATCH SET n.description=line.a
ON MATCH SET n.identifier=line.code_a
ON MATCH SET n.fieldA=line.a
)
但不工作。
换句话说,如果我为以下csv文件应用所需的密码代码
code_a | a| code_b| b | code_c | c|
100,BLANKEMPTY1001662,3374991001662,BLANKEMPTY1001662,3374991001662,BLANKEMPTY1001662_BLANKEMPTY1001662
100,BLANKEMPTY1002,3374991002,BLANKEMPTY1002,3374991002,BLANKEMPTY1002_BLANKEMPTY1002
101,a101,101,NameForB1,c101_0,NameForC1
101,a101,101,NameForB1,c101_1,NameForC2
101,a101,101,NameForB1,c101_2,NameForC3
101,a101,101,NameForB1,c101_3,NameForC4
........................................
102,a102,102,NameForB2,c102_0,NameForC1
102,a102,102,NameForB2,c102_1,NameForC2
102,a102,102,NameForB2,c102_2,NameForC3
102,a102,102,NameForB2,c102_3,NameForC4
它将加载csv(对于101,102个节点,没有任何特殊代码或字符串),并且最终只有一个code_a等于100的节点(包含特殊代码特殊字符串的节点)和最后一个信息即BLANKEMPTY1002,3374991002,BLANKEMPTY1002, 3374991002,BLANKEMPTY1002_BLANKEMPTY1002
在后台它创建了第一个节点,第一次使用100,BLANKEMPTY1001662,3374991001662,并用最后的信息覆盖它(更新它)(我们可以为相同的code_a使用特定字符串,因为我们希望有很多行)在我们的例如,最后的信息是这样的:BLANKEMPTY1002,3374991002,BLANKEMPTY1002,3374991002,BLANKEMPTY1002_BLANKEMPTYVIDE1002
我们将只有一个节点持有最后的信息。
0)约束
CREATE CONSTRAINT ON (r:Region) ASSERT r.region IS UNIQUE;
CREATE CONSTRAINT ON (c:City) ASSERT c.cityName IS UNIQUE;
CREATE CONSTRAINT ON (s:Sector) ASSERT s.sectorName IS UNIQUE;
1)-file-name.csv
CODE_TER,TERRITOIRE,CODE_BRICK,BRICK,CODE_SBRICK,SOUSBRICK
101,NEWYORK,101,NEWYORK,10101_0,NEWYORK_La
101,NEWYORK,101,NEWYORK,10101_1,NEWYORK_Oula
101,NEWYORK,101,NEWYORK,10101_2,NEWYORK_Laou
101,NEWYORK,101,NEWYORK,10101_3,NEWYORK_Karir
101,NEWYORK,101,NEWYORK,10101_4,NEWYORK_Jeyan
101,NEWYORK,101,NEWYORK,10101_5,NEWYORK_Ttot
101,NEWYORK,101,NEWYORK,10101_6,NEWYORK_Slba
101,NEWYORK,101,NEWYORK,10101_7,NEWYORK_Sla
101,NEWYORK,101,NEWYORK,10101_8,NEWYORK_Sen
101,NEWYORK,101,NEWYORK,10101_9,NEWYORK_Zda
101,NEWYORK,105,JERSY,10102_0,JERSY_Bouss
101,NEWYORK,105,JERSY,10102_1,JERSY_Aha
101,NEWYORK,105,JERSY,10102_2,JERSY_Kbir
101,NEWYORK,105,JERSY,10102_3,JERSY_Shell
101,NEWYORK,105,JERSY,10102_4,JERSY_Rinaobia
101,NEWYORK,105,JERSY,10102_5,JERSY_RinaCha
101,NEWYORK,105,JERSY,10102_6,JERSY_BiGfet
101,NEWYORK,105,JERSY,10102_7,ARBA_DotCenter
101,NEWYORK,105,JERSY,10102_8,JERSY_DtCentreKhsShell
101,NEWYORK,105,JERSY,10102_9,JERSY_Ta
101,NEWYORK,105,JERSY,10103_10,JERSY_Zura
101,NEWYORK,105,JERSY,10103_11,JERSY_Arua
102,Maine,102,Maine,10201_0,AUGUSTA_Bnada
102,Maine,102,Maine,10201_1,AUGUSTA_Chwf
102,Maine,102,Maine,10201_2,AUGUSTA_Ter
102,Maine,102,Maine,10201_3,AUGUSTA_Lama
102,Maine,102,Maine,10201_4,AUGUSTA_Mssa
102,Maine,102,Maine,10201_5,AUGUSTA_Ash
102,Maine,102,Maine,10201_6,AUGUSTA_AlMa
102,Maine,102,Maine,10201_7,AUGUSTA_Aline
102,Maine,102,Maine,10201_8,AUGUSTA_Boef
102,Maine,102,Maine,10202_9,AUGUSTA_DoCentGnaya
102,Maine,102,Maine,10202_10,AUGUSTA_Ksir
102,Maine,102,Maine,10202_11,AUGUSTA_Slhli
102,Maine,102,Maine,10202_12,AUGUSTA_Lkua
102,Maine,102,Maine,10202_13,AUGUSTA_DoTning
102,Maine,102,Maine,10202_14,AUGUSTA_Si
102,Maine,102,Maine,10202_15,AUGUSTA_Azzinate
102,Maine,102,Maine,10202_16,AUGUSTA_AsBraz
102,Maine,102,Maine,10202_17,AUGUSTA_DntCenterKaoui
102,Maine,102,Maine,10202_18,AUGUSTA_Dari
2)初始工作请求
LOAD CSV WITH HEADERS FROM "file:///the-file-name.csv" as
line FIELDTERMINATOR ','
MERGE (r:Region{region: line.TERRITOIRE})
ON CREATE SET r.description=line.TERRITOIRE
ON CREATE SET r.identifier=line.CODE_TER
ON CREATE SET r.id = toString(id(r))
MERGE (c:City {cityName:line.BRICK})
ON CREATE SET c.identifier=line.CODE_BRICK
ON CREATE SET c.region=line.TERRITOIRE
ON CREATE SET c.regionIdentifier=line.CODE_TER
ON CREATE SET c.zip=line.CODE_BRICK
ON CREATE SET c.description=line.BRICK
ON CREATE SET c.id = toString(id(c))
WITH c,r,line
MATCH (c {identifier:line.CODE_BRICK}),(r {identifier:line.CODE_TER})
CREATE UNIQUE (c)-[:IS_A_City_BELONGING_TO]->(r)
MERGE (s:Sector {sectorName:line.SOUSBRICK})
ON CREATE SET s.identifier=line.CODE_SBRICK
ON CREATE SET s.region=line.TERRITOIRE
ON CREATE SET s.regionIdentifier=line.CODE_TER
ON CREATE SET s.city=line.BRICK
ON CREATE SET s.cityIdentifier=line.CODE_BRICK
ON CREATE SET s.description=line.SOUSBRICK
ON CREATE SET s.zip=line.SOUSBRICK
ON CREATE SET s.id = toString(id(s))
WITH s,c,r,line
MATCH (s {identifier:line.CODE_SBRICK}),(r{identifier:line.CODE_TER})
CREATE UNIQUE (s)-[:IS_A_SECTOR_BELONGING_TO_THAT_REGION]->(r)
WITH s,c,r,line
MATCH (s {identifier:line.CODE_SBRICK}),(c{identifier:line.CODE_BRICK})
CREATE UNIQUE (s)-[:IS_A_SECTOR_BELONGING_TO_THAT_CITY]->(c)
3)扩展的csv文件,包含两行specialCode和SpecialStrings
CODE_TER,TERRITOIRE,CODE_BRICK,BRICK,CODE_SBRICK,SOUSBRICK
100,BLANKEMPTYVIDE1001662,3374991001662,BLANKEMPTYVIDE1001662,3374991001662,BLANKEMPTYVIDE1001662_BLANKEMPTYVIDE1001662
100,BLANKEMPTYVIDE1002,3374991002,BLANKEMPTYVIDE1002,3374991002,BLANKEMPTYVIDE1002_BLANKEMPTYVIDE1002
101,NEWYORK,101,NEWYORK,10101_0,NEWYORK_La
101,NEWYORK,101,NEWYORK,10101_1,NEWYORK_Oula
101,NEWYORK,101,NEWYORK,10101_2,NEWYORK_Laou
101,NEWYORK,101,NEWYORK,10101_3,NEWYORK_Karir
101,NEWYORK,101,NEWYORK,10101_4,NEWYORK_Jeyan
101,NEWYORK,101,NEWYORK,10101_5,NEWYORK_Ttot
101,NEWYORK,101,NEWYORK,10101_6,NEWYORK_Slba
101,NEWYORK,101,NEWYORK,10101_7,NEWYORK_Sla
101,NEWYORK,101,NEWYORK,10101_8,NEWYORK_Sen
101,NEWYORK,101,NEWYORK,10101_9,NEWYORK_Zda
101,NEWYORK,105,JERSY,10102_0,JERSY_Bouss
101,NEWYORK,105,JERSY,10102_1,JERSY_Aha
101,NEWYORK,105,JERSY,10102_2,JERSY_Kbir
101,NEWYORK,105,JERSY,10102_3,JERSY_Shell
101,NEWYORK,105,JERSY,10102_4,JERSY_Rinaobia
101,NEWYORK,105,JERSY,10102_5,JERSY_RinaCha
101,NEWYORK,105,JERSY,10102_6,JERSY_BiGfet
101,NEWYORK,105,JERSY,10102_7,ARBA_DotCenter
101,NEWYORK,105,JERSY,10102_8,JERSY_DtCentreKhsShell
101,NEWYORK,105,JERSY,10102_9,JERSY_Ta
101,NEWYORK,105,JERSY,10103_10,JERSY_Zura
101,NEWYORK,105,JERSY,10103_11,JERSY_Arua
102,Maine,102,Maine,10201_0,AUGUSTA_Bnada
102,Maine,102,Maine,10201_1,AUGUSTA_Chwf
102,Maine,102,Maine,10201_2,AUGUSTA_Ter
102,Maine,102,Maine,10201_3,AUGUSTA_Lama
102,Maine,102,Maine,10201_4,AUGUSTA_Mssa
102,Maine,102,Maine,10201_5,AUGUSTA_Ash
102,Maine,102,Maine,10201_6,AUGUSTA_AlMa
102,Maine,102,Maine,10201_7,AUGUSTA_Aline
102,Maine,102,Maine,10201_8,AUGUSTA_Boef
102,Maine,102,Maine,10202_9,AUGUSTA_DoCentGnaya
102,Maine,102,Maine,10202_10,AUGUSTA_Ksir
102,Maine,102,Maine,10202_11,AUGUSTA_Slhli
102,Maine,102,Maine,10202_12,AUGUSTA_Lkua
102,Maine,102,Maine,10202_13,AUGUSTA_DoTning
102,Maine,102,Maine,10202_14,AUGUSTA_Si
102,Maine,102,Maine,10202_15,AUGUSTA_Azzinate
102,Maine,102,Maine,10202_16,AUGUSTA_AsBraz
102,Maine,102,Maine,10202_17,AUGUSTA_DntCenterKaoui
102,Maine,102,Maine,10202_18,AUGUSTA_Dari
4)我尝试过的密码代码
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:///the-file-name.csv" as
line FIELDTERMINATOR ','
OPTIONAL MATCH (r:Region) where r.region contains "BLANKEMPTYVIDE" AND r.identifier= line.CODE_TER
WITH (CASE WHEN r IS NULL THEN [1] ELSE [] END ) AS todoRegion,line
FOREACH (x IN todoRegion |
MERGE (n:Region{region: line.TERRITOIRE})
ON CREATE SET n.description=line.TERRITOIRE
ON CREATE SET n.identifier=line.CODE_TER
ON CREATE SET n.id = toString(id(n))
ON MATCH SET n.description=line.TERRITOIRE
ON MATCH SET n.identifier=line.CODE_TER
ON MATCH SET n.region=line.TERRITOIRE
)
with line
OPTIONAL MATCH (c:City) where c.cityName contains "BLANKEMPTYVIDE" AND c.regionIdentifier= line.CODE_TER
WITH (CASE WHEN c IS NULL THEN [1] ELSE [] END ) AS todoCity,line
FOREACH (x IN todoCity |
MERGE (cci:City {cityName:line.BRICK})
ON CREATE SET cci.identifier=line.CODE_BRICK
ON CREATE SET cci.region=line.TERRITOIRE
ON CREATE SET cci.regionIdentifier=line.CODE_TER
ON CREATE SET cci.zip=line.CODE_BRICK
ON CREATE SET cci.description=line.BRICK
ON CREATE SET cci.id = toString(id(cci))
ON MATCH SET cci.identifier=line.CODE_BRICK
ON MATCH SET cci.region=line.TERRITOIRE
ON MATCH SET cci.regionIdentifier=line.CODE_TER
ON MATCH SET cci.zip=line.CODE_BRICK
ON MATCH SET cci.description=line.BRICK
ON MATCH SET cci.cityName=line.BRICK
)
with line
MATCH (cit:City{identifier:line.CODE_BRICK}),(reg:Region{identifier:line.CODE_TER})
CREATE UNIQUE (cit)-[:IS_A_City_BELONGING_TO]->(reg)
WITH line,cit
OPTIONAL MATCH (s:Sector) where s.description contains "BLANKEMPTYVIDE" AND s.regionIdentifier=line.CODE_TER
WITH (CASE WHEN s IS NULL THEN [1] ELSE [] END ) AS todoSector,line,cit
FOREACH (x IN todoSector |
MERGE (b:Sector {sectorName:line.SOUSBRICK})
ON CREATE SET b.identifier=line.CODE_SBRICK
ON CREATE SET b.region=line.TERRITOIRE
ON CREATE SET b.regionIdentifier=line.CODE_TER
ON CREATE SET b.city=line.BRICK
ON CREATE SET b.cityIdentifier=line.CODE_BRICK
ON CREATE SET b.description=line.SOUSBRICK
ON CREATE SET b.zip=line.SOUSBRICK
ON CREATE SET b.id = toString(id(b))
ON MATCH SET b.identifier=line.CODE_SBRICK
ON MATCH SET b.region=line.TERRITOIRE
ON MATCH SET b.regionIdentifier=line.CODE_TER
ON MATCH SET b.city=line.BRICK
ON MATCH SET b.cityIdentifier=line.CODE_BRICK
ON MATCH SET b.description=line.SOUSBRICK
ON MATCH SET b.zip=line.SOUSBRICK
ON MATCH SET b.sectorName = line.SOUSBRICK
)
with line
MATCH (sss:Sector)
WHERE sss.identifier=line.CODE_SBRICK
WITH sss,line
MATCH (nnn:Region)
WHERE nnn.identifier=line.CODE_TER
CREATE UNIQUE (sss)-[:IS_A_SECTOR_BELONGING_TO_THAT_REGION]->(nnn)
WITH sss,line
MATCH (ccc:City)
WHERE ccc.identifier=line.CODE_BRICK
CREATE UNIQUE (sss)-[:IS_A_SECTOR_BELONGING_TO_THAT_CITY]->(ccc)
发布于 2018-05-31 17:59:49
LOAD CSV WITH HEADERS FROM "file:///the-file-name.csv" as line
FIELDTERMINATOR ','
with line as line
OPTIONAL MATCH (n:Region)
WHERE n.region contains "BLANKEMPTYVIDE" AND n.identifier= line.CODE_TER
WITH n, line
CALL apoc.do.when(
n IS NULL,
'MERGE (r:Region{region: line.TERRITOIRE}) ON CREATE SET r.description=line.TERRITOIRE ON CREATE SET r.identifier=line.CODE_TER ON CREATE SET r.id = toString(id(r)) RETURN r',
'RETURN n AS r',
{n: n, line: line}) YIELD value
WITH value.r AS r, line
SET r.identifier=line.CODE_TER
SET r.description=line.TERRITOIRE
SET r.region=line.TERRITOIRE
WITH r,line
OPTIONAL MATCH (ci:City) where ci.cityName contains "BLANKEMPTYVIDE" AND ci.regionIdentifier= line.CODE_TER
CALL apoc.do.when(
ci IS NULL,
'MERGE (c:City {cityName:line.BRICK}) ON CREATE SET c.identifier=line.CODE_BRICK ON CREATE SET c.region=line.TERRITOIRE ON CREATE SET c.regionIdentifier=line.CODE_TER ON CREATE SET c.zip=line.CODE_BRICK ON CREATE SET c.description=line.BRICK ON CREATE SET c.id = toString(id(c)) RETURN c',
'RETURN ci AS c',
{ci: ci, line: line}) YIELD value
WITH value.c AS c,line,r
SET c.identifier=line.CODE_BRICK
SET c.region=line.TERRITOIRE
SET c.regionIdentifier=line.CODE_TER
SET c.zip=line.CODE_BRICK
SET c.description=line.BRICK
SET c.cityName=line.BRICK
WITH c,r,line
MATCH (c {identifier:line.CODE_BRICK}),(r {identifier:line.CODE_TER})
MERGE (c)-[:IS_A_City_BELONGING_TO]->(r)
WITH c,r,line
OPTIONAL MATCH (sec:Sector)
WHERE sec.description contains "BLANKEMPTYVIDE" AND sec.regionIdentifier=line.CODE_TER
CALL apoc.do.when(
sec IS NULL,
'MERGE (s:Sector {sectorName:line.SOUSBRICK}) ON CREATE SET s.identifier=line.CODE_SBRICK ON CREATE SET s.region=line.TERRITOIRE ON CREATE SET s.regionIdentifier=line.CODE_TER ON CREATE SET s.city=line.BRICK ON CREATE SET s.cityIdentifier=line.CODE_BRICK ON CREATE SET s.description=line.SOUSBRICK ON CREATE SET s.zip=line.SOUSBRICK ON CREATE SET s.id = toString(id(s)) RETURN s',
'RETURN sec AS s',
{sec: sec, line: line}) YIELD value
WITH value.s AS s,line,c,r
SET s.identifier=line.CODE_SBRICK
SET s.region=line.TERRITOIRE
SET s.regionIdentifier=line.CODE_TER
SET s.city=line.BRICK
SET s.cityIdentifier=line.CODE_BRICK
SET s.description=line.SOUSBRICK
SET s.zip=line.SOUSBRICK
SET s.sectorName = line.SOUSBRICK
WITH s,c,r,line
MATCH (s {identifier:line.CODE_SBRICK}),(r{identifier:line.CODE_TER})
MERGE (s)-[:IS_A_SECTOR_BELONGING_TO_THAT_REGION]->(r)
WITH s,c,r,line
MATCH (s {identifier:line.CODE_SBRICK}),(c{identifier:line.CODE_BRICK})
MERGE (s)-[:IS_A_SECTOR_BELONGING_TO_THAT_CITY]->(c)
结果:
Set 28271 properties, created 3400 relationships, completed after 34985 ms.
https://stackoverflow.com/questions/-100001647
复制相似问题