2015-02-11 3 views
1

Я не уверен, почему я получаю ошибку ниже, но я полагаю, что это то, что я делаю неправильно.RNeo4j Ошибка: 400 Bad Request

Во-первых, вы можете получить мой набор данных, загрузив файл dataset.r с this link и загрузив его в вашу сессию с dget("dataset.r").

В моем случае я бы сделал dat = dget("dataset.r").

Код, приведенный ниже, используется для загрузки данных в Neo4j.

library(RNeo4j) 

graph = startGraph("http://localhost:7474/db/data/") 
graph$version 

# sure that the graph is clean -- you should backup first!!! 
clear(graph, input = FALSE) 

## ensure the constraints 
addConstraint(graph, "School", "unitid") 
addConstraint(graph, "Topic", "topic_id") 

## create the query 
## BE CAREFUL OF WHITESPACE between KEY:VALUE pairs for parameters!!! 
query = " 
MERGE (s:School {unitid:{unitid}, 
instnm:{instnm}, 
obereg:{obereg}, 
carnegie:{carnegie}, 
applefeeu:{applfeeu}, 
enrlft:{enrlft}, 
applcn:{applcn}, 
admssn:{admssn}, 
admit_rate:{admit_rate}, 
ape:{ape}, 
sat25:{sat25}, 
sat75:{sat75} }) 

MERGE (t:Topic {topic_id:{topic_id}, 
topic:{topic} }) 

MERGE (s)-[:HAS_TOPIC {score:{score} }]->(t) 
" 

for (i in 1:nrow(dat)) { 
    ## status 
    cat("starting row ", i, "\n") 
    ## run the query 
    cypher(graph, 
     query, 
     unitid = dat$unitid[i], 
     instnm = dat$instnm[i], 
     obereg = dat$obereg[i], 
     carnegie = dat$carnegie[i], 
     applfeeu = dat$applfeeu[i], 
     enrlft = dat$enrlt[i], 
     applcn = dat$applcn[i], 
     admssn = dat$admssn[i], 
     admit_rate = dat$admit_rate[i], 
     ape = dat$apps_per_enroll[i], 
     sat25 = dat$sat25[i], 
     sat75 = dat$sat75[i], 
     topic_id = dat$topic_id[i], 
     topic = dat$topic[i], 
     score = dat$score[i]) 
} #endfor 

Я могу успешно загрузить первые 49 записей моего dataframe dat, но ошибки на 50-й строке.

Это ошибка, я получаю:

starting row 50 
Show Traceback 

Rerun with Debug 
Error: 400 Bad Request 

{"message":"Node 1477 already exists with label School and property \"unitid\"=[110680]","exception":"CypherExecutionException","fullname":"org.neo4j.cypher.CypherExecutionException","stacktrace":["org.neo4j.cypher.internal.compiler.v2_1.spi.ExceptionTranslatingQueryContext.org$neo4j$cypher$internal$compiler$v2_1$spi$ExceptionTranslatingQueryContext$$translateException(ExceptionTranslatingQueryContext.scala:154)","org.neo4j.cypher.internal.compiler.v2_1.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations.setProperty(ExceptionTranslatingQueryContext.scala:121)","org.neo4j.cypher.internal.compiler.v2_1.spi.UpdateCountingQueryContext$CountingOps.setProperty(UpdateCountingQueryContext.scala:130)","org.neo4j.cypher.internal.compiler.v2_1.mutation.PropertySetAction.exec(PropertySetAction.scala:51)","org.neo4j.cypher.internal.compiler.v2_1.mutation.MergeNodeAction$$anonfun$exec$1.apply(MergeNodeAction.scala:80)","org.neo4j.cypher.internal.compiler.v2_1 

Вот моя сессия информация:

> sessionInfo() 
R version 3.1.0 (2014-04-10) 
Platform: x86_64-apple-darwin13.1.0 (64-bit) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RNeo4j_1.2.0 

loaded via a namespace (and not attached): 
[1] RCurl_1.95-4.1 RJSONIO_1.2-0.2 tools_3.1.0 

И стоит отметить, что я использую Neo4j 2.1.3.

Благодарим за любую помощь заранее.

+0

__UPDATE__: Я выбрал 'tryCatch' с' next', чтобы просто пропускать ошибки пропуска. Вот строки, в которых были проблемы: '50-55,364,661'. Что-нибудь о тех рядах, которые бросаются в глаза – Btibert3

ответ

3

Это проблема с тем, как работает MERGE. Установив score свойство внутри самой здесь п MERGE ...

MERGE (s)-[:HAS_TOPIC {score:{score} }]->(t) 

... MERGE пытается создать всю картину, и, таким образом, ваше ограничение уникальности нарушается. Вместо этого сделайте это:

MERGE (s)-[r:HAS_TOPIC]->(t) 
SET r.score = {score} 

Я смог импортировать все ваши данные после внесения этого изменения.