2013-05-06 17 views
2

举例来说,如果我有一个交易创造了两个节点是否有可能有不同类型的节点中的Neo4j图形数据库

node1 = db.graphDb.createNode(); 
node2 = db.graphDb.createNode(); 

// index user id 
node1.setProperty("abc", "fkdjasflasdjlf"); 
db.nodeIndex.add(node1, "abc", "fkdjasflasdjlf"); 

节点1拥有财产“ABC”,但节点2没有。

然后我试图在节点上查询,如清单所有具有财产“ABC”等于“fkdjasflasdjlf”的节点。

ExecutionResult result = engine.execute("START n=node(*) WHERE n.abc = 'fkdjasflasdjlf' return n "); 

Neo4j的产生异常

Exception in thread "main" org.neo4j.cypher.EntityNotFoundException: The property 'abc' does not exist on Node[0] 
at org.neo4j.cypher.internal.commands.expressions.Property.apply(Property.scala:35) 
at org.neo4j.cypher.internal.commands.expressions.Property.apply(Property.scala:29) 
at org.neo4j.cypher.internal.commands.Equals.isMatch(ComparablePredicate.scala:60) 
at org.neo4j.cypher.internal.pipes.FilterPipe$$anonfun$createResults$1.apply(FilterPipe.scala:29) 
at org.neo4j.cypher.internal.pipes.FilterPipe$$anonfun$createResults$1.apply(FilterPipe.scala:29) 
at scala.collection.Iterator$$anon$22.hasNext(Iterator.scala:390) 
at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334) 
at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334) 
at org.neo4j.cypher.PipeExecutionResult.hasNext(PipeExecutionResult.scala:138) 
at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334) 
at scala.collection.JavaConversions$IteratorWrapper.hasNext(JavaConversions.scala:562) 
at neo4j.TestNodeSearch.main(TestNodeSearch.java:59) 
    Caused by: org.neo4j.graphdb.NotFoundException: 'abc' property not found for NodeImpl#0. 
at  
    org.neo4j.kernel.impl.core.Primitive.newPropertyNotFoundException(Primitive.java:184) 
at org.neo4j.kernel.impl.core.Primitive.getProperty(Primitive.java:179) 
at org.neo4j.kernel.impl.core.NodeImpl.getProperty(NodeImpl.java:52) 
at org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:155) 
at org.neo4j.cypher.internal.commands.expressions.Property.apply(Property.scala:33) 

那么,有没有办法来支持节点的“不同种类”或目前,只有一种类型的节点支持?

非常感谢!

回答

2

您需要使用HAS功能。

ExecutionResult result = engine.execute("START n=node(*) WHERE HAS(n.abc) AND n.abc = 'fkdjasflasdjlf' return n "); 
2

你需要使用“有”的关键字,如

START m=node(*) WHERE has(m.name) AND m.name ='Micha' RETURN id(m), m.name; 

至于节点类型去,你只需要添加属性类型的每个节点。节点只是一个空白对象,通过输入它们可以区分它们并将各种类型链接在一起。

我们使用的一个很好的模式设计是一个与Type = 'Subreference'Subreference关系的根节点。然后,我们创建它们通过“实例”的关系连接到所述Subreference节点Type = 'Person'节点。这样对任何节点总是有一个路线图,你只需要过滤数据库中的一小部分节点。

3

正如其他人所指出的那样,你需要确认节点上存在评估其价值之前abc财产,否则会抛出异常。有两种方法可以做到这一点:

  1. 使用hasfunction

    START n=node(*) WHERE has(m.abc) AND n.abc = 'fkdjasflasdjlf' return n

  2. 使用!property operator(其计算结果为假的缺少的属性)。

    START n=node(*) WHERE n.abc! = 'fkdjasflasdjlf' return n

作为一般的音符,在Neo4j的节点是无类型/无模式。节点要么有或没有你正在寻找的属性,你只需要适当地处理每个案例。你可以尝试强制执行排序模式,例如,给每个节点的Type属性,但Neo4j的不会执行任何种类的适合你的规则。

相关问题