как обрабатывать сложный тип в emf M2M

Я новичок в EMF M2M. У меня проблема с использованием ATL, когда целевая модель содержит сложные типы. Вот небольшой пример, чтобы показать это. Предположим, я перехожу из моделей Families.ecore (таких же, как пример Faimilies2Persons на веб-сайте ATL) в Graph.ecore (ключевая часть показана ниже). Я хочу создать граф, в котором каждый член семьи является одним узлом, а два узла связаны, если они оба мужчины или женщины. Затем я начинаю с этого шаблона, как показано ниже. В результате каждый член является одним узлом, но между тем я получаю несколько графов, и каждый граф имеет только один узел. Итак, кто-нибудь может мне помочь, как поместить все узлы в один граф? В принципе, я думаю, что это очень общая проблема, когда ATL обрабатывает модели со сложными типами иерархии. Большое спасибо!

module families2graph;
create OUT : graph from IN : Families;

entrypoint rule myrule() {
	to
		t: graph!Graph (
			 name <-  'mygraph',
			 type <- #Directed

		)
}
rule Member2Female {
	from
		s : Families!Member 
	to
		t1 : graph!Graph (
			nodes <- t2	
		),
		t2 : graph!Node (
			name <- s.firstName	
		)
}

<eClassifiers xsi:type="ecore:EClass" name="Graph">
  <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
    <details key="name" value="Graph" />
    <details key="kind" value="elementOnly" />
  </eAnnotations>
  <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
      <details key="kind" value="element" />
      <details key="name" value="name" />
    </eAnnotations>
  </eStructuralFeatures>
  <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" lowerBound="1" eType="#//EdgeDirection" unsettable="true">
    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
      <details key="kind" value="element" />
      <details key="name" value="type" />
    </eAnnotations>
  </eStructuralFeatures>
  <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1" eType="#//Node" containment="true" resolveProxies="false">
    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
      <details key="kind" value="element" />
      <details key="name" value="nodes" />
    </eAnnotations>
  </eStructuralFeatures>
  <eStructuralFeatures xsi:type="ecore:EReference" name="edges" upperBound="-1" eType="#//Edge" containment="true" resolveProxies="false">
    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
      <details key="kind" value="element" />
      <details key="name" value="edges" />
    </eAnnotations>
  </eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Node">
  <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
    <details key="name" value="Node" />
    <details key="kind" value="elementOnly" />
  </eAnnotations>
  <eStructuralFeatures xsi:type="ecore:EReference" name="connectedEdges" upperBound="-1" eType="#//Edge" resolveProxies="false">
    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
      <details key="kind" value="element" />
      <details key="name" value="ConnectedEdges" />
    </eAnnotations>
  </eStructuralFeatures>
  <eStructuralFeatures xsi:type="ecore:EReference" name="properties" upperBound="-1" eType="#//Property" containment="true" resolveProxies="false">
    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
      <details key="kind" value="element" />
      <details key="name" value="properties" />
    </eAnnotations>
  </eStructuralFeatures>
  <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
      <details key="kind" value="attribute" />
      <details key="name" value="name" />
    </eAnnotations>
  </eStructuralFeatures>
</eClassifiers>


person Yong    schedule 04.03.2015    source источник


Ответы (1)


Ваше правило Member2Female указывает, что из Member будут созданы два элемента: Graph и Node. Вы должны поместить часть nodes <-... в точку входа myrule(), где создается ваш «основной» элемент Graph. Вы можете попробовать это:

module families2graph;
create OUT : graph from IN : Families;

entrypoint rule myrule() {
    to
        t: graph!Graph (
             name <-  'mygraph',
             type <- #Directed,
             nodes <- Families!Member.allInstances()->collect(e | thisModule.Member2Female(e))
        )
}

unique lazy rule Member2Female {
    from
        s : Families!Member 
    to
        t : graph!Node (
            name <- s.firstName 
        )
}

Отмеченная строка указывает, что ссылка nodes будет владеть элементами, сгенерированными из всех экземпляров Member из модели Families.

Если вам нужны дополнительные сведения, вы можете попробовать: https://wiki.eclipse.org/ATL/User_Guide_-_The_ATL_Language и найдите Journal2Book определение правила и пояснения.

person Vincent Aranega    schedule 04.03.2015
comment
Большое спасибо! С вашим решением у меня появилась новая ошибка. Невозможно установить для узлов функций значение [org.eclipse.emf.ecore.impl.DynamicEObjectImpl@1d664dc8 (eClass: org.eclipse.emf.ecore.impl.EClassImpl@2ad30dee (имя: Участник) (instanceClassName: null) @Vincent Aranege - person Yong; 04.03.2015
comment
Я предполагаю, что ошибка связана с отмеченной строкой, которая назначает экземпляры Member узлам. И в настоящее время мне все еще не ясно, можно ли сделать что-то подобное с Java или С++, например newNode=... then nodes.add(newNode) или graph!Graph.nodes[1].name ‹-..... @Винсент Аранега - person Yong; 04.03.2015
comment
Ой, мой плохой. Я не гуру ATL, я больше QVTo парень. Я изменил правило отложенного ответа для Member2Female. Я установил для правила значение unique lazy, чтобы заставить его выполнение с тем же элементом ввода дать тот же результат. - person Vincent Aranega; 04.03.2015