簡體   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