2016-07-20 10 views
0

Ich versuche, die folgende Equipment.XML in Neo4j Datenbank zu laden -Neo4j Chiffre Parse und laden XML

<NetworkEntity> 
     <Equipment> 
       <Name>IPTC.net/ABC12345</Name> 
       <Type>CHASSIS</Type> 
       <SubType>Nokia 7750</SubType> 
     </Equipment> 
     <Equipment> 
       <Name>IPTC.net/ABC12345/Shelf-1</Name> 
       <Type>SHELF</Type> 
       <SubType>Nokia 7750</SubType> 
       <Associations> 
         <Association> 
           <Target> 
             <EntityName>IPTC.net/ABC12345</EntityName> 
             <EntityType>Equipment</EntityType> 
           </Target> 
           <RelationshipType>RESIDES_ON</RelationshipType> 
           <Features> 
             <Feature> 
               <Name>Feat1</Name> 
               <Value>123</Value> 
             </Feature> 
           </Features> 
         </Association> 
       </Associations> 
     </Equipment> 
</NetworkEntity> 

ich folgende Chiffre Prozedur geschrieben haben bisher -

call apoc.load.xml("file:///opt/home/neo4j/NEO4JINSTANCE1/neo4j-enterprise-3.0.1/import/Equipment.xml") 
     yield value as ne UNWIND ne._children AS eqs 
     FOREACH(eq IN eqs | 
     FOREACH(child IN eq["_children"] | 
     CREATE (:SPAEquipment {name: child["_text"]}))) 
     RETURN *; 

Aber es ist Berücksichtigung jeder Eigenschaft des Equipment-Tags als separate SPAEquipment. Daher Name, Typ und Untertyp - jeder wird als SPAEquipment anstelle von drei Eigenschaften desselben SPAEquipments erstellt. Also anstelle von Kindern sollte ich verschiedene Tags verwenden. Ich bin auch nicht in der Lage, die Verbindung zwischen den Geräten ganz korrekt zu erstellen.

Also, im Grunde muss ich die verschiedenen Geräte in der Datenbank mit den entsprechenden Eigenschaften erstellen und auch ich muss die Beziehungen zwischen ihnen erstellen.

Antwort

1

Ich bin nicht so vertraut mit load_xml, aber ich denke neo4j tut genau das, was Sie fragen.

Sie haben die Schaffung auf das Kind der Ausrüstung. Sie sagen: Für jeden, die Kinder bekommen, jeweils für _child SPEquipment CREATE ...

Was ich denke, Sie wollen, ist

For each <Equipment> 
    CREATE (s:SPAEquipment {id:<maybe with a simple ID here>}) 
For each _child 
    set s.propertyName=child["text"] 

Aber ich bin nicht sicher, wie apoc.load. xml macht das Der einzige Weg, wie ich die Kinder bekommen konnte, ist als ein Array von Paaren (_type, _text) und ich kann nicht scheinen, herauszufinden, wie man damit etwas macht.

call apoc.load.xml("file:///Volumes/Data/neo4j-enterprise- 3.0.3/import/myXML.xml") yield value as ne UNWIND ne._children AS eqs 
RETURN eqs, [attr IN eqs._children WHERE attr._type IN 
    ['Name','Type','SubType'] | [attr._type, attr._text]] as pairs 



╒══════════════════════════════╤══════════════════════════════╕ 
│eqs       │pairs       │ 
╞══════════════════════════════╪══════════════════════════════╡ 
│{_type: Equipment, id: 01, _ch│[[Name, IPTC.net/ABC12345], [T│ 
│ildren: [{_type: Name, _text: │ype, CHASSIS], [SubType, Nokia│ 
│IPTC.net/ABC12345}, {_type: Ty│ 7750]]      │ 
│pe, _text: CHASSIS}, {_type: S│        │ 
│ubType, _text: Nokia 7750}]} │        │ 
├──────────────────────────────┼──────────────────────────────┤ 

[...] Hinweis: Ich habe id auf meine Probe Attribute, werden Sie nicht diejenigen haben.

+0

Hallo @pwsaker: Vielen Dank für die schnelle Antwort. Ich habe folgendes formuliert - '... FOREACH (eq IN eqs | ERSTELLEN (e.NSEquipment)) FOREACH (Kind IN eq [" _ Kinder "] | gesetzt e.NSEquipment.propertyName = Kind [" Text " ]) foreach (Kind in Gleichung [ „_ Kinder“] | überprüfen Sie, ob Verbände Feld vorhanden ist Wenn ja, eine RESIDES_ON Beziehung mit dem Ziel Und schaffen Eigenschaften der Beziehung zu schaffen; ' Aber ich bin nicht in der Lage schreibe die Aussagen richtig auf. –

0

Ich konnte dieses Problem mit apoc.load.xml nicht lösen. apoc.load.xml bricht die Struktur in einen Baum und wir müssen eine Chiffre darüber schreiben. Aber es war eine sehr komplexe Abfrage und ich konnte es nicht richtig schreiben.

Also schrieb ich eine XSL, die die Equipment.xml analysieren und die Cypher-Abfragen erstellen würde. Dies ist nur für unseren internen Zweck und es funktioniert gut.

Danke.