繁体   English   中英

neo4j图形数据库中是否可能具有不同类型的节点

[英]Is it possible to have different types of nodes in a neo4j graph database

例如,如果我在事务中创建了两个节点

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

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

node1具有属性“abc”但node2没有。

然后,我尝试查询节点,例如列出所有属性为“ 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)

那么有什么方法可以支持“不同类型”的节点,或者目前仅支持一种类型的节点?

非常感谢!

正如其他人所指出的,您需要在评估其值之前验证节点上是否存在abc属性,否则抛出异常。 有两种方法可以做到这一点:

  1. 使用has 函数

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

  2. ! 属性运算符 (对于缺少的属性,其值为false)。

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

作为一般说明,Neo4j中的节点是无类型/无模式的。 一个节点要么具有或者没有你正在寻找的属性,你只需要妥善处理每个案例。 您可以尝试强制执行某种模式,例如,为每个节点提供Type属性,但Neo4j不会为您强制执行任何类型的规则。

您需要使用HAS功能。

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

您需要使用“has”关键字,例如

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

就节点类型而言,您只需要向每个类型的节点添加一个属性。 该节点只是一个空白对象,通过键入它们可以区分它们并将各种类型链接在一起。

我们使用的一个好的模式设计是一个根节点,它具有Type = 'Subreference' Subreference关系。 然后我们创建Type = 'Person'的节点,它们通过'Instance'关系连接到Subreference节点。 对于任何节点,总是有一个路线图,您只需要过滤数据库中的一小部分节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM