Java 如何使用cypher迭代具有多个值的列?
我试过的代码是Java 如何使用cypher迭代具有多个值的列?,java,neo4j,cypher,Java,Neo4j,Cypher,我试过的代码是 firstNode = graphDb.createNode();//creating nodes like this firstNode.setProperty( "person", "Andy " ); Label myLabel = DynamicLabel.label("person"); firstNode.addLabel(myLabel); ... relationship = firstNode.createRelati
firstNode = graphDb.createNode();//creating nodes like this
firstNode.setProperty( "person", "Andy " );
Label myLabel = DynamicLabel.label("person");
firstNode.addLabel(myLabel); ...
relationship = firstNode.createRelationshipTo( secondNode, RelTypes.emails );// creating relationships like this
relationship.setProperty( "relationship", "email " );....
Transaction tx1 = graphDb.beginTx();
try{
ExecutionEngine engine = new ExecutionEngine(graphDb);
ExecutionResult result = engine.execute("MATCH (sender:person)-[:emails]-(receiver) RETURN sender, count(receiver)as count, collect(receiver) as receivers ORDER BY count DESC ");..
我得到的结果是:
sender | count | receivers
Node[2]{person:"Chris"} | 3 | [Node[4]{person:"Elsa "},Node[0]{person:"Andy "},Node[1]{person:"Bobby"}]
Node[4]{person:"Elsa "} | 3 | [Node[5]{person:"Frank"},Node[2]{person:"Chris"},Node[3]{person:"David"}]
Node[1]{person:"Bobby"} | 3 | [Node[2]{person:"Chris"},Node[3]{person:"David"},Node[0]{person:"Andy "}]
Node[5]{person:"Frank"} | 2 | [Node[3]{person:"David"},Node[4]{person:"Elsa "}
我想迭代接收器。因此,我尝试了以下方法:
for (Map<String,Object> row : result) {
Node x = (Node)row.get("receivers");
System.out.println(x);
for (String prop : x.getPropertyKeys()) {
System.out.println(prop +": "+x.getProperty(prop));
}
for(映射行:结果){
Node x=(Node)row.get(“接收者”);
系统输出println(x);
对于(字符串属性:x.getPropertyKeys()){
System.out.println(prop+“:”+x.getProperty(prop));
}
但它在线程“main”java.lang.ClassCastException中引发异常:scala.collection.convert.Wrappers$SeqWrapper不能强制转换为org.neo4j.graphdb.Node
如何执行此操作?问题在于,在cypher查询中,您将receiver.person属性收集到一个名为receivers的数组中。receivers不是一个节点,而是一个属性数组。您不能将其转换为字符串。如果您希望获得实际的receiver节点,则需要将查询语句更改为:
MATCH (sender:person)-[:emails]-(receiver) RETURN sender, count(receiver)as count, receiver as receivers ORDER BY count DESC
或者,如果要使用属性数组,则可以执行类似以下代码的操作:
Object receivers = row.get("receivers")
if(receivers instanceof String[]) {
for(String receiver in receivers) {
.. do something
}
} else {
// do something with receiver as a single string value
}
显然,如果不是字符串,您需要将接收器的类型从字符串更改为适当的类型。这是一件简单的事情
try{
ExecutionEngine engine = new ExecutionEngine(graphDb);
ExecutionResult result = engine.execute("MATCH (sender:person)-[:emails]-(receiver) RETURN sender, count(receiver)as count, collect(receiver.person) as receivers ORDER BY count DESC ");
//ExecutionResult result = engine.execute("MATCH (sender:person)-[:emails]->(receiver) WITH sender, collect(receiver.person) as receivers, RETURN {sender: sender.person, receivers: receivers) ORDER BY size(receivers) DESC");
//System.out.println(result.dumpToString());
LinkedList list_prop = new LinkedList();
for (Map<String,Object> row : result) {
Node x = (Node)row.get("sender");
Object y = row.get("receivers");
System.out.println(y);
for (String prop_x : x.getPropertyKeys()) {
System.out.println(prop_x +": "+x.getProperty(prop_x));
}
}
tx1.success();
}
finally {
tx1.close();
}
试试看{
ExecutionEngine=新的ExecutionEngine(graphDb);
ExecutionResult=engine.execute(“匹配(发送方:个人)-[:电子邮件](接收方)返回发送方,计数(接收方)作为计数,按计数描述收集(接收方.个人)作为接收方订单”);
//ExecutionResult=engine.execute(“匹配(发送者:人)-[:电子邮件]->(接收者)与发送者,收集(接收者.人)作为接收者,返回{发送者:发送者.人,接收者:接收者)按大小排序(接收者)描述”);
//System.out.println(result.dumpToString());
LinkedList_prop=新建LinkedList();
用于(地图行:结果){
Node x=(Node)row.get(“发送方”);
对象y=行获取(“接收者”);
系统输出打印项次(y);
对于(字符串prop_x:x.getPropertyKeys()){
System.out.println(prop_x+”:“+x.getProperty(prop_x));
}
}
tx1.成功();
}
最后{
tx1.close();
}
在匹配查询中,我使用了“collect(receiver.person)as receivers”而不是“collect(receiver)as receivers”。它起作用了。谢谢你的回答。是的。row.get(“receivers”)只会抛出错误。但是get(“sender”)起作用了!!。我已经编辑了这个问题。